【发布时间】:2014-03-13 10:51:41
【问题描述】:
我需要在整个域中记录很多东西,因此我的大多数域和应用程序服务都依赖于日志记录实现。假设我创建了这个小合约:
public interface ILogger {
void Info(string message);
}
太好了。现在我实现了一个基于 log4net 的基础设施服务:
public class Log4NetProxy : ILogger {
private ILog _logger = LogManager.GetLogger();
public void Info(string message) {
_logger.Info(message);
}
}
但是,由于我的大多数类都具有其他依赖项而不仅仅是记录器,因此我越来越接近于构造函数注入模式..
public class MyService : IMyService {
public MyService(ILogger logger, IRepository repo, IAlsoNeedSettings settings) {
}
}
如何避免注入诸如设置或日志记录等基本核心需求,而只关注我真正需要的依赖项?属性注入?服务门面?静态日志工厂?
【问题讨论】:
-
看面向切面编程
-
private ILog _logger = LogManager.GetLogger();是服务定位器,而不是注入器。我使用 Autofac,但我仍然没有找到一种很好的方法来注入不是为从头开始(构造函数或属性/字段)注入而设计的对象图;通常有一些“根”需要集成,然后如果存在差距,则可能需要公开容器以进行直接/SL 解析(至少在图表可以再次开始自行解析之前)。
标签: c# dependency-injection domain-driven-design ninject constructor-injection