我有三个项目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对象。
请指导我!!
答案 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。