Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在两个程序集之间共享全局统一容器,而不传递引用_C#_.net_Dependency Injection_Unity Container - Fatal编程技术网

C# 在两个程序集之间共享全局统一容器,而不传递引用

C# 在两个程序集之间共享全局统一容器,而不传递引用,c#,.net,dependency-injection,unity-container,C#,.net,Dependency Injection,Unity Container,我有两个集会: 服务-具有用于存储库的接口 DB-使用存储库实现 参考方向是从DB到服务(DB参考服务) 服务程序集创建一个Unity容器。它将在运行时动态加载DB程序集(以加载实现) 现在我需要在DB程序集中注册存储库对象,但我找不到任何方法检索DB程序集中已经创建的Unity容器(而不是创建一个具有不同上下文的新容器) 问题是(可能的解决方案):有没有办法获取当前AppDomain中已创建容器的列表(在ASM之间共享) 我不想使用查找(发现),如: container.RegisterT

我有两个集会:

  • 服务-具有用于存储库的接口
  • DB-使用存储库实现
参考方向是从DB到服务(DB参考服务)

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

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

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

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

container.RegisterTypes(AllClasses.FromLoadedAssemblies(),
  WithMappings.FromMatchingInterface,
  WithName.Default);
因为我希望我的绑定是显式的。

您确实不应该在任何
服务
DB
类库中使用(甚至引用)DI容器。唯一应该使用容器的地方是容器

组合根是应用程序中的入口点。在您的例子中,它是Console应用程序的
main
方法。在这里,通过向容器注册类型并解析对象(通常是单个根对象),可以从所有类库中组合类


你的类库不应该有合成根。只有应用程序具有组合根。这允许其他应用程序在使用不同的DI容器时使用这些类库,甚至不使用任何(称为)类库。

回答我自己的问题,但是。。。我发现在统一中没有这样的特征

可能的解决办法:

  • 如果程序集是静态引用的,则必须引用容器调用引导方法,例如UnityConfig.Register(容器)
  • 如果在没有任何静态引用的情况下动态加载程序集(插件)。调用问题本身中的代码,即:


所以服务和数据库是类库,对吗?你在哪里使用它们?是否有在同一解决方案中使用它们的应用程序?或者您的项目是一个只包含类库的组件吗?为了示例起见,我提供了一些信息,说明有一个控制台应用程序引用该服务。是的,所有东西都在一个解决方案中。听起来适合单片应用。但是:1)在服务和数据库之间存在“依赖倒置”模式。你建议做一个循环参考。2) 当根应用程序仍然需要连接接口和实现时,抽象接口的意义何在?这样我就可以忽略接口,到处使用具体类型。即使如此,实现也不公开。3) “注册”的中心点听起来像是一个拥有无所不知的主类的单片反模式。4) 无论如何,在运行时之前,我不知道要加载哪个DB实现。.@andrew.fox,因为(1)为什么存在循环依赖?正如您所说,DB依赖于服务,现在COMPOSITIONROOT同时依赖于DB和服务。没有循环依赖关系。对于(2),您仍然需要有接口,因为您希望将来替换依赖关系。例如,对于注入到某个类中的dependency IDependency,今天您使用的是DependencyA。将来,您将转到合成根并将其更改为DependencyB。对于(3),合成根不必是单个类。它可以是单个项目中的多个类。但是是的,它必须知道一切。组合根构成应用程序。您的应用程序需要了解所有类才能将它们组合在一起。例如,抽象工厂模式。
container.RegisterTypes(AllClasses.FromLoadedAssemblies(),
  WithMappings.FromMatchingInterface,
  WithName.Default);