【问题标题】:How to inject class in constructor of another class?如何在另一个类的构造函数中注入类?
【发布时间】:2017-02-25 16:54:30
【问题描述】:

我在一个解决方案中有三个项目 com.comman、com.business 和另一个解决方案中的 com.xyz。

在 com.comman 中,我有一个类,可以说是记录器,它在构造函数中接受一个参数。所以在 com.business 我指的是 commans DLL 并将记录器 obj 创建为 var obj=new logger("MIS");

像这样我想在 com.xyz 中创建记录器对象,但不引用 com.comman dll。有没有可能做到这一点?

注意:在 com.business 项目中,我正在调用 com.xyz 中名为“ABC”的类之一,该类再次调用 com.xyz 中的另一个类“PQR”。我想在 PQR 类中创建记录器对象。

请指导我!!

【问题讨论】:

  • 您是在谈论不同的解决方案或项目吗?如果不将一个项目引用到另一个项目,我认为您无法做到这一点。如果您绝对不想使用引用,您可能可以动态加载 DLL 并使用反射..
  • 是的,两个不同的解决方案,com.comman、com.business 在一个解决方案中,而 com.xyz 在另一个解决方案中。

标签: c# dependency-injection dependencies


【解决方案1】:

我假设程序集 com.xyz 不允许引用程序集 com.comman,因为 com.xyz 位于不同的解决方案中,并且该解决方案已经引用了 com.xyz

这意味着PQR 类不能依赖于com.comman.Logger。您仍然希望能够在PQR 中注入该记录器。

解决这个问题的方法是在com.xyz 中定义一个抽象/接口,并让PQR 依赖于该接口。例如:

// Logger abstraction specifically tailored at the needs of com.xyz
public class ILogger {
    void Log(string message);
}

public class PQR {
    private readonly ILogger logger;
    public PQR(ILogger logger) {
        if (logger == null) throw new ArgumentNullException("logger");
        this.logger = logger;
    }
    // PQR methods
}

这个新的com.xyz.ILogger 抽象的存在允许您创建一个从com.xyz.ILogger 映射到com.comman.logger 的适配器。这个适配器应该位于com.business 的解决方案中。最可取的地方是Composition Root。 Composition Root 很可能是一个引用您的 com.business 的程序集,但如果 com.business 是您的启动项目,那将是创建适配器的地方。

此适配器可能如下所示:

public class ComXyzLoggerAdapter : com.xyz.ILogger {
    private com.comman.logger logger;
    ComXyzLoggerAdapter(com.comman.logger logger)
        this.logger = logger;
    }

    public void Log(string message) {
        // Here we map from com.xyz.ILogger to comman.Logger 
        this.logger.LogError(message);
    }
}

在您创建PQR 类的位置(在com.business 解决方案中),您现在需要这样做:

var abc =
    new ABC(
        new QPR(
            new ComXyzLoggerAdapter(
                new com.comman.logger("MIS"))));

我们在这里所做的基本上是应用Dependency Inversion Principle

【讨论】:

  • 这就是我要找的……谢谢!!
猜你喜欢
  • 2015-09-04
  • 1970-01-01
  • 2020-05-20
  • 1970-01-01
  • 1970-01-01
  • 2020-11-07
  • 2020-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多