如何在另一个类的构造函数中注入类?

时间:2016-10-16 18:34:34

标签: c# dependency-injection dependencies

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

在com.comman中我有一个类可以说是logger,它在构造函数中需要一个参数。所以在com.business我指的是commans DLL并创建logger obj as var obj = new logger(“MIS”);

像这样我想在com.xyz中创建logger对象但不引用com.comman dll。是否有可能实现这一目标?

注意:从com.business项目我调用com.xyz的一个名为“ABC”的类,它再次调用com.xyz中的另一个类“PQR”。我想在PQR类中创建logger对象。

请指导我!!

1 个答案:

答案 0 :(得分:0)

我假设程序集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。组合根可能是引用您的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