我在从配置文件读取项目时将Unity IOC实现了一些麻烦。
这就是我所拥有的
1)ClasslibraryA
2)引用ClasslibraryA的ClasslibraryB
3)Winforms App引用ClasslibraryB
注意:SomeOther应用程序将引用ClassLibraryA,例如。一个网络服务。
必须根据IOC的使用位置为IOC配置ClasslibraryA。 例如。如果在Web服务中调用IDataSource并从本地应用程序调用它,它将会有所不同。
ClasslibraryB也有自己的一组依赖项,也可以由主应用程序注入,在本例中是winforms应用程序。 ClasslibraryB将在循环中实例化许多ClasslibraryA对象。
Winforms app将包含ClassLibraryB的dependancies实现的具体实现,而Container.Configure应该在这里调用?
我的问题是,
何时何地调用应用程序中的Container.Configure?
我是否需要所有子库层/层的子容器?
classlibraryB或winforms应该将ClasslibraryA的具体类实现注入classlibraryA吗?
我应该将每个图层/层的IOC配置分组到配置文件中的不同“容器”名称吗?
答案 0 :(得分:3)
每个应用程序都拥有一个单独的容器,并负责配置该容器实例。配置和解析调用应尽可能接近应用程序的入口点。这称为组合根。
您的Windows窗体应用程序应在其引导代码中拥有,配置和解析容器。可能还有其他应用程序也使用ClassLibraryA与它完全无关。
Web Service应该拥有另一个容器并对其进行配置以满足其需求。它对Windows Forms应用程序一无所知。
以下是有关撰写根的更多信息:
所有库都应该完全与DI容器无关,以便您可以使用任何容器(以及任何容器实例)连接所有依赖项。
请点击此处了解更多详情:
正如您可能已经注意到的,这些是一般原则并且适用于整体DI - 不仅仅适用于Unity。
答案 1 :(得分:0)
你应该在应用程序的最开始调用Container.Configure,但是ClassLibraryA应该手动接收依赖项,可能有被调用的WebMethod实例化(或询问ioc实例)右类型