单个 ASP.net 应用程序中的多个 DI 框架
Multiple DI-frameworks in a single ASP.net application
是否有人知道是否可以在同一个应用程序中使用多个 DI 框架(例如 Unity 和 Ninject)。或者框架 "collide" 会互相影响吗?
一切皆有可能。但是有没有意义就是另一回事了。
您可以使用 DI 框架 1 创建一部分对象图,然后使用 DI 框架 2 创建另一部分对象图,然后您可以 wire/connect 手动创建两个对象图。
请注意,您可能不应该在 class 库(您的框架)中使用 DI 框架。 DI 框架(或 DI 容器)只能在应用程序内部使用(在 Composition Root)。
引自参考文章(Composition Root):
Only applications should have Composition Roots. Libraries and frameworks shouldn't.
因此,如果您只是构建某种框架(比如用于数据访问或电子邮件消息处理),那么您不应该使用任何 DI 容器(DI 和 DI 容器是不同的东西)。在您的框架中,您应该通过在构造函数中声明 class 的依赖项并确保此类依赖项是抽象的(例如声明为接口)来启用 DI。
您的框架的使用者随后将决定使用哪个 DI 容器(或者即使他们首先想要使用 DI 容器)。
在我看来,不使用 DI 容器更好(即使在应用程序中)。请参阅 this article 了解原因。
是否有人知道是否可以在同一个应用程序中使用多个 DI 框架(例如 Unity 和 Ninject)。或者框架 "collide" 会互相影响吗?
一切皆有可能。但是有没有意义就是另一回事了。
您可以使用 DI 框架 1 创建一部分对象图,然后使用 DI 框架 2 创建另一部分对象图,然后您可以 wire/connect 手动创建两个对象图。
请注意,您可能不应该在 class 库(您的框架)中使用 DI 框架。 DI 框架(或 DI 容器)只能在应用程序内部使用(在 Composition Root)。
引自参考文章(Composition Root):
Only applications should have Composition Roots. Libraries and frameworks shouldn't.
因此,如果您只是构建某种框架(比如用于数据访问或电子邮件消息处理),那么您不应该使用任何 DI 容器(DI 和 DI 容器是不同的东西)。在您的框架中,您应该通过在构造函数中声明 class 的依赖项并确保此类依赖项是抽象的(例如声明为接口)来启用 DI。
您的框架的使用者随后将决定使用哪个 DI 容器(或者即使他们首先想要使用 DI 容器)。
在我看来,不使用 DI 容器更好(即使在应用程序中)。请参阅 this article 了解原因。