Ori*_*rds 7 .net dependency-injection n-tier-architecture
我有一个3层的.NET服务应用程序,遵循标准方法:
Frontend -> Object Model / Business Logic -> Data Access
Run Code Online (Sandbox Code Playgroud)
我一直在努力学习依赖注入,到目前为止已经发现它很棒(使用Autofac).3层中的每一层都需要创建各种各样的对象,有时需要额外的配置/等.似乎DI容器应该是理想的解决方案,但是我遇到了一些问题,看看它应该与系统的其他部分相关.
目前我在前端有一个配置DI容器的类.它基本上是一大堆代码说container.Register<SomeType>()等等.
问题是,它正在为所有3层配置容器,因此必须具有对数据访问层的相当侵入性的知识.在我的前端有这样的知识的代码在我的头脑中引起了警钟,因为将应用程序分成层级的关键是避免这种情况.
由于我的数据访问层不只是SQL服务器是一个笨拙的桶,而是由许多复杂的COM互操作和P/Invoke调用组成,所以这也变得更糟,因此对DI有相当大的影响组态.
我已经考虑过打破它 - 可能每层有一个容器,或者每层都有一个"Setup"类与全局DI容器对话以注册它自己的位,但我不确定这是否会导致比它解决的问题更多......
如果有人可以分享他们使用DI与多层应用程序的经验,我将非常感激.
谢谢,猎户座.
这取决于您是否具有三层(物理分离)或者所有逻辑层是否部署在一起。如果前端与 BL 分离并通过 Web 服务或 WCF 进行通信,那么前端和后端需要自己的容器,因为它们在单独的进程或单独的机器中运行。容器只会注册自己的组件和“下”层的接口。
另一方面,如果所有层都在同一进程中运行,那么您应该只有一个容器。容器将在应用程序的起点进行初始化并托管,例如 Web 应用程序的 global.asax。
容器主机了解系统的所有不同部分的问题可以通过不一一注册类,而是在程序集中注册所有类型来解决。这样,您就不需要仅仅为了配置容器而对解决方案中的所有程序集进行强引用。如何使用温莎城堡完成此操作的示例:
Kernel.Register(AllTypes.Pick().FromAssemblyName("DataAccessLayer.dll"));
Kernel.Register(AllTypes.Pick().FromAssemblyName("BusinessLogic.dll"));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1608 次 |
| 最近记录: |