如何在另一个类的构造函数中注入类
本文关键字:构造函数 注入 另一个 | 更新日期: 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"))));
我们在这里所做的基本上是应用依赖倒置原则。