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

Share global Unity Container between two assemblies without passing a reference

我有两个程序集:

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

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

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

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

我不想使用查找(发现),像这样:

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

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

您真的不应该在任何 SERVICEDB 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);