在不传递引用的情况下在两个程序集之间共享全局 Unity 容器
Share global Unity Container between two assemblies without passing a reference
我有两个程序集:
- 服务 - 带有存储库接口
- DB - 带有存储库实现
引用方向是从DB到SERVICE(DB引用SERVICE)。
SERVICE 程序集创建一个 Unity 容器。它将在运行时动态加载数据库程序集(以加载实现)。
现在我需要在数据库程序集中注册存储库对象,但我找不到任何方法检索已经在数据库程序集中创建的 Unity 容器(而不是创建一个具有不同上下文的新容器)。
问题是(可能的解决方案):有什么方法可以获取当前 AppDomain 中已创建容器的列表(以在 asms 之间共享)
我不想使用查找(发现),像这样:
container.RegisterTypes(AllClasses.FromLoadedAssemblies(),
WithMappings.FromMatchingInterface,
WithName.Default);
因为我希望我的绑定是明确的。
您真的不应该在任何 SERVICE
或 DB
class 库中使用(甚至引用)DI 容器。唯一应该使用容器的地方是 Composition Root.
复合根是应用程序的入口点。在您的情况下,它是控制台应用程序的 main
方法。在这里,您可以通过向容器注册类型并解析您的对象(通常是单个根对象)来从所有 class 库中组合 classes。
您的 class 库不应该有 Composition Roots。只有应用程序具有组合根。这允许其他应用程序在使用不同的 DI 容器时使用这些 class 库,甚至不使用任何(称为 Pure DI)。
回答我自己的问题但是...我发现Unity中没有这样的功能。
可能的解决方案:
- 如果程序集被静态引用 - bootstrap 必须引用容器调用方法,例如UnityConfig.Register(容器);
- 如果程序集是在没有任何静态引用的情况下动态加载的(插件)。调用问题本身中提供的代码,即:
container.RegisterTypes(AllClasses.FromLoadedAssemblies(),
WithMappings.FromMatchingInterface,
WithName.Default);
我有两个程序集:
- 服务 - 带有存储库接口
- DB - 带有存储库实现
引用方向是从DB到SERVICE(DB引用SERVICE)。
SERVICE 程序集创建一个 Unity 容器。它将在运行时动态加载数据库程序集(以加载实现)。
现在我需要在数据库程序集中注册存储库对象,但我找不到任何方法检索已经在数据库程序集中创建的 Unity 容器(而不是创建一个具有不同上下文的新容器)。
问题是(可能的解决方案):有什么方法可以获取当前 AppDomain 中已创建容器的列表(以在 asms 之间共享)
我不想使用查找(发现),像这样:
container.RegisterTypes(AllClasses.FromLoadedAssemblies(),
WithMappings.FromMatchingInterface,
WithName.Default);
因为我希望我的绑定是明确的。
您真的不应该在任何 SERVICE
或 DB
class 库中使用(甚至引用)DI 容器。唯一应该使用容器的地方是 Composition Root.
复合根是应用程序的入口点。在您的情况下,它是控制台应用程序的 main
方法。在这里,您可以通过向容器注册类型并解析您的对象(通常是单个根对象)来从所有 class 库中组合 classes。
您的 class 库不应该有 Composition Roots。只有应用程序具有组合根。这允许其他应用程序在使用不同的 DI 容器时使用这些 class 库,甚至不使用任何(称为 Pure DI)。
回答我自己的问题但是...我发现Unity中没有这样的功能。
可能的解决方案:
- 如果程序集被静态引用 - bootstrap 必须引用容器调用方法,例如UnityConfig.Register(容器);
- 如果程序集是在没有任何静态引用的情况下动态加载的(插件)。调用问题本身中提供的代码,即:
container.RegisterTypes(AllClasses.FromLoadedAssemblies(),
WithMappings.FromMatchingInterface,
WithName.Default);