如何在IOC容器中注册类型,但是以容器不可知的方式?

时间:2013-04-16 12:56:59

标签: dependency-injection ioc-container autofac service-locator

*我有一个使用IOC容器的应用程序(Autofac,但可以是任何容器)。

我也有外部开发的模块。每个模块都需要指定自己的DI容器设置,定义存储库,特定于其模块的服务。

在部署时,这些模块随后通过XML配置手动注册到Autofac。

通常,如果每个模块都想从IOC容器中请求Type的实例,我们可以使用ServiceLocator模式。这将每个模块与特定的IOC容器类型分离,例如, Autofac /统一/ StructureMap /等

但我希望在注册时将每个模块与IOC容器分离。例如,在执行container.Register()。As();

所有的IOC容器都有不同的方法几乎可以达到同样的效果,所以我想知道它是否有标准模式。

更新:我正在寻找一种方法来对类型的注册进行不确定性而不是解析类型实例。

2 个答案:

答案 0 :(得分:4)

由于这种情况,服务定位器模式已经失宠。将模块与IOC容器分离绝对是一个好主意,但服务定位器模式意味着它们仍然需要以某种方式引用它。编写自己的通用IOC容器包装器不是任何人都应该忍受的任务。

这种情况更常被接受的模式是注入模块的依赖关系(最有可能通过构造函数注入),并且只在代码的入口点引用IOC容器。然后初始化模块,其所有依赖关系已经满足。由于IOC容器仅在一个地方被引用,因此不需要将其抽象出来。您可以选择一个,如果稍后更改,您只需要更改代码中的一个类。

换句话说,只要模块向IOC容器询问对象的实例,就要通过模块的构造函数传递此实例。如果您需要请求的对象具有运行时依赖性,则通过构造函数为它们传递工厂。

有关详细信息,请参阅this文章。

Martin Fowler对服务定位器的看法不那么苛刻,但我认为结论是一样的。

答案 1 :(得分:0)

自这篇文章以来已经很长时间了,但我为此目的创建了一个名为'Agnostic IoC'的项目,该项目专门用于解决您描述的问题并使用不可知的核心API来提供这种能力设置您的注册,然后在最终实现中使用nuget包来解释它。

https://github.com/cardinal252/Agnostic-Ioc

http://cardinalcore.co.uk/agnostic-ioc/getting-started/