c# - .NET 反射依赖注入(inject)与多个容器

标签 c# .net reflection dependency-injection

我对依赖注入(inject)比较陌生,所以我可能在某种程度上扼杀了这个概念。但是,我正在尝试实现类似以下的目标,但不确定它是否可行:

假设我有两个容器,每个容器包含相同类型依赖项的不同实例。例如,每个包含 MyApplicationContextMyRequestContext 的不同单个实例。

现在假设我有几个类依赖于其中一个(或两个)实例。他们不应该关心他们使用的是两个容器中的哪个;他们只需要一个依赖实例来完成工作。

在理想情况下,这些可靠类中的每一个都在其构造函数中进行静态调用,而构造函数又从适当的容器中反射性地注入(inject)依赖项...

public class MyDependableClass{
  protected MyApplicationContext Application {get; set;}
  protected MyRequestContext Request {get; set;}
  public MyDependableClass() {
    Dependencies.Inject(this);
  }
}

但是,据我所知,没有确定适当容器的实用方法。我考虑过针对特定容器注册每个对象(例如 container.Register(obj); ),但这会很费力,如果构造函数中需要依赖项,则不会起作用。或者,您可以分析调用堆栈以从已注册的顶级对象推断容器......不适用于异步调用等

有什么想法吗?

示例: 我可能有几个依赖代理实例的类;我们称它为 ILogicProxy。该代理可以将调用转发到另一台机器上的本地逻辑或远程逻辑。此外,该应用程序可以与多个远程机器建立连接。所以......我们可能有多个 ILogicProxy 实例需要注入(inject)到几个类中......但是哪个去哪里?像这样的解决方案可以只使用简单的“setter 属性注入(inject)”,但是当需要更多依赖项时这不会扩展,因为它会导致“连接”过程变得困惑/冗长。

最佳答案

这不是多个容器的情况。使用容器配置来连接。如果您在ILogicProxy 接口(interface)下注册了大量组件,那么是的,您将不得不进行更多的手动布线。但是问问自己,这些组件是否真的应该注册在同一个接口(interface)下。

关于代码示例:

In an ideal world, each of these dependable classes makes a static call in its constructor, which in turn reflectively injects the dependencies from an appropriate container...

public class MyDependableClass{
  protected MyApplicationContext Application {get; set;}
  protected MyRequestContext Request {get; set;}
  public MyDependableClass() {
    Dependencies.Inject(this);
  }
}

这是服务位置,而不是依赖注入(inject)。总是喜欢依赖注入(inject)而不是服务位置。尽量不要依赖组件中的 Resolve() 或 Inject() 方法。

关于c# - .NET 反射依赖注入(inject)与多个容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4021780/

相关文章:

java - 从java中选定文件的类获取方法

java - 此反射 Java 代码如何捕获 System.out.println 中的字符串?

C# 同时更新两个文本框?

c++ - 如何关闭 SYSTEM_HANDLE(或另一个进程中打开的文件句柄)

c# - 进程无法访问文件,因为它被另一个进程使用

c#重定向(管道)进程输出到另一个进程

java - scala 反射在这种情况下无法工作

c# - 如何使用 .NET Core 2.2 创建依赖于框架的可执行文件

c# - 像 Google 搜索一样搜索组合框

c# - 更改页面样式 Android WebView