我正在尝试用C#构建一个多层应用程序(服务)。确切地说,我正在尝试用ASP构建一个REST Web服务。NET Web Api,它将由我自己托管(与Owin一起)。到目前为止,我有以下组件(每个组件都在一个单独的.dll中):
-RestHost(在我的情况下是一个控制台应用程序)
-RestService(这是我的web服务,切换所有控制器)
-InterfacesLayer
-ModelLayer(这里是我使用的对象,只是它们的get/set方法)
-DataLayer(ModelLayer中的每个类在DataLayer中都有自己的类,此外还有数据库连接类)
-BusinessLayer(这里完成了所有的逻辑,模型中的每个类都有自己的类,并且该层与REST服务和数据层通信)
RestHost——顾名思义,它是我服务的主机。除此之外,我还在这里进行依赖项注入。由于它不是太多的代码,我会发布它:
static void Main(string[] args)
{
IUnityContainer container = new UnityContainer();
// Dependency Resolving
container.RegisterType<IAktData, AktDataImpl>(new HierarchicalLifetimeManager());
container.RegisterType<IAktService, AktServiceImpl>(new HierarchicalLifetimeManager());
container.RegisterType<ILeistungData, LeistungDataImpl>(new HierarchicalLifetimeManager());
container.RegisterType<ILeistungService, LeistungServiceImpl>(new HierarchicalLifetimeManager());
container.RegisterType<IPersonData, PersonDataImpl>(new HierarchicalLifetimeManager());
container.RegisterType<IPersonService, PersonServiceImpl>(new HierarchicalLifetimeManager());
container.RegisterType<IPersistent, FirebirdDB>(new HierarchicalLifetimeManager());
string serverAddress = ConfigurationManager.AppSettings["serverAddress"];
string connectionString = ConfigurationManager.ConnectionStrings["connectionStrings"].ConnectionString;
using (RESTService.StartServer(container, serverAddress,connectionString ))
{
Console.WriteLine("Server started @ "+ DateTime.Now.ToString() + " on " + serverAddress + "/api");
Console.ReadLine();
}
}
哦,还有我忘了提的,但你可以从代码中看到,在我的主机应用程序中,我也在阅读应用程序。配置我的连接字符串所在的位置
这就是我的问题。我不知道如何从我的服务访问数据库连接。在这里,我正在数据访问层中实现Firebird,但我不确定如何在应用程序中使用它。当然,最简单的方法就是创建一个实例并将其传递给我的服务,但这是我最不想做的事情。我也一直在考虑将Firebird实现为静态类或单例,但后来我无法使用我的IPersistant接口(除此之外,我认为这不是正确的方法)
所以我的问题是,这类东西有什么最佳实践吗?我需要以某种方式将连接字符串传递给IPersistent(Firebird)的实现,但实际上没有在RESTService中创建Firebird的实例。
感谢
多层应用程序(如您正在构建的应用程序)的一般模式是拥有一个数据层,该数据层为您的服务提供对数据库的访问权限,或其他一些持久化数据的方法,通常通过存储库。
然后,您可以配置IoC容器,将连接字符串注入存储库,然后将存储库注入服务。这样,您的服务就可以不知道数据是如何持久化的,并可以专注于定义业务逻辑。
事实上,我对一个存储库做了类似的事情,它不是将数据持久化到数据库中,而是将数据存储在Azure的CDN上的一个blob中。我的IoC(在我的情况下是StructureMap)中的配置如下:
string storageApiKey = ConfigurationManager.AppSettings["CloudStorageApiKey"];
string storageUsername = ConfigurationManager.AppSettings["CloudStorageUsername"];
this.For<IImageStorageRepository>().Use<ImageStorageRepository>().Ctor<string>("storageApiKey").Is(storageApiKey).Ctor<string>("storageUsername").Is(storageUsername);
我的存储库是这样的:
public class ImageStorageRepository : IImageStorageRepository
{
....
public ImageStorageRepository(string storageApiKey, string storageUsername)
{
this.cloudIdentity = new CloudIdentity() { APIKey = storageApiKey, Username = storageUsername };
this.cloudFilesProvider = new CloudFilesProvider(cloudIdentity);
}
....
}