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

本文关键字:构造函数 注入 另一个 | 更新日期: 2023-09-27 18:13:13

我有三个项目。com. command, com。业务在一个解决方案和com。

在com. command中,我有一个类,比如logger,它在构造函数中有一个参数。所以在com。业务我是指命令DLL和创建日志记录器对象var obj=new logger("MIS");

像这样,我想在com中创建logger对象。Xyz,但不引用com. command_dll。这有可能实现吗?

注意:来自com。商业项目我叫一个班叫"ABC"的com。它再次调用com.xyz中的另一个类"PQR"。我想在PQR类中创建记录器对象。

请引导我!!

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

我假设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的解决方案中。最可取的地方是组合根。组合根可能是一个引用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"))));

我们在这里所做的基本上是应用依赖倒置原则。