如何在 IOC 容器中注册类型,但以与容器无关的方式?

pet*_*low 0 dependency-injection ioc-container autofac service-locator

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

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

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

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

但是我想在注册时将每个模块与 IOC 容器解耦。例如在做 container.Register().As(); 时

所有的 IOC 容器都有不同的方法来实现几乎相同的事情,所以我想知道是否有标准模式。

更新:我正在专门寻找一种方法来不可知类型的注册而不是类型实例的解析。

Pat*_*sen 5

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

对于这种情况,更普遍接受的模式是注入模块的依赖项(最有可能通过构造函数注入)并且仅在代码的入口点引用 IOC 容器。然后,模块将在满足所有依赖关系的情况下进行初始化。由于 IOC 容器只在一处被引用,因此没有必要将其抽象掉。随便选一个,以后改的话,只需要改代码中的一个类即可。

换句话说,每当一个模块向 IOC 容器请求一个对象的实例时,而是通过模块的构造函数传递这个实例。如果您需要请求的对象具有运行时依赖项,则通过构造函数为它们传递一个工厂。

有关更多详细信息,请参阅这篇文章。

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