我有一个3层.NET服务的应用程序,以下的标准方法:

Frontend -> Object Model / Business Logic -> Data Access

我想了解沿途依赖注入,因此到目前为止已经发现了它巨大的(使用Autofac)。各3层的需要来创建对象的分类,有时有额外的配置/等。这似乎是DI容器应该是解决这一理想的事情,但我有一些问题看,它应该住在相对于系统的其余部分。

目前我具有其中构成DI容器前端的类。它基本上是代码说container.Register<SomeType>()等一大束。

的问题是,它是配置在容器的所有3层,因此必须具有数据访问层的相当侵入性知识。在我的前端有这样的知识有代码设置警铃大作在我的头上,作为应用分成层级的一点是要避免这种确切情况。结果 这也被事实证明我的数据访问层不只是SQL服务器是位哑斗变得更糟,而是由大量的互操作复杂的COM和P的/ Invoke调用,所以对DI相当的影响配置。

我已经给了一些思考打破它 - 也许有每层一个容器,或具有其中会谈到全球DI容器每层注册它自己的位的“设置”类,但我不知道这将导致更多的问题比它解决...

我真的很感激,如果任何人都可以使用DI与多层应用程序分享他们的经验。

谢谢,猎户。

有帮助吗?

解决方案

此取决于如果有具有三个层级(物理分离),或者如果所有的逻辑层部署在一起。如果前端是从你的BL分开,并通过一个Web服务或WCF然后在前端进行通信,并且,因为他们在单独的进程或单独的机器上运行的后台需要自己的容器。容器将仅注册其自己的组件和“下一个”层的接口。

在另一方面,如果所有的层都在同一进程中运行,那么你应该只有一个容器。容器将被初始化,并在类似的Global.asax的web应用程序的应用程序的起点主持。

与容器主机知道该多系统的所有不同部分的问题可以通过不登记类逐一来解决,而是在装配寄存器的所有类型。这样,你并不需要所有的组件的强引用您的解决方案只是配置容器。

:如何能够与城堡Winsdor来完成实施例
Kernel.Register(AllTypes.Pick().FromAssemblyName("DataAccessLayer.dll"));
Kernel.Register(AllTypes.Pick().FromAssemblyName("BusinessLogic.dll"));
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top