在两个程序集之间共享全局Unity容器而不传递引用

时间:2015-12-30 17:21:05

标签: c# .net dependency-injection unity-container

我有两个集会:

  • SERVICE - 使用存储库接口
  • DB - 使用存储库实现

参考方向是从DB到SERVICE(DB引用SERVICE)。

SERVICE程序集创建一个Unity容器。它将在运行时动态加载DB程序集(加载实现)。

现在我需要在数据库程序集中注册存储库对象,但我无法找到任何方法在数据库程序集中检索已创建的Unity容器(而不是创建具有不同上下文的新容器)。

问题是(可能的解决方案):有没有办法在当前的AppDomain中获取已创建的容器列表(在asms之间共享)

我不想使用查找(发现),如下所示:

container.RegisterTypes(AllClasses.FromLoadedAssemblies(),
  WithMappings.FromMatchingInterface,
  WithName.Default);

因为我希望我的绑定是明确的。

2 个答案:

答案 0 :(得分:2)

你真的不应该在任何SERVICEDB类库中使用(甚至引用)DI容器。应该使用容器的唯一地方是Composition Root

Composition Root是应用程序中的入口点。在您的情况下,它是控制台应用程序的main方法。在这里,您可以通过向容器注册类型并解析对象(通常是单个根对象)来编写所有类库中的类。

您的班级图书馆不应该有作文根。只有应用程序具有组合根。这允许其他应用程序在使用不同的DI容器时使用这些类库,甚至不使用任何(也称为Pure DI)。

答案 1 :(得分:0)

回答我自己的问题,但......我发现Unity中没有这样的功能。

可能的解决方案:

  • 如果静态引用程序集 - 必须在引用容器时调用引导程序方法,例如UnityConfig.Register(容器);
  • 如果动态加载程序集(插件)而没有任何静态引用。调用问题本身提供的代码,即:
container.RegisterTypes(AllClasses.FromLoadedAssemblies(),
  WithMappings.FromMatchingInterface,
  WithName.Default);