2011-02-01 33 views
4

我现在很困惑,也许并不了解真正的问题。如何设置统一容器来创建模拟/实际记录器实例

我有一个对象需要记录器实例来记录错误数据。

例如

public class CommonFileSaver : IFileSaver 
    { 
      private static ILog _log = LogManager.GetLogger(); 

      ..... 
    } 

我要测试的日志记录过程。而我目前的决定是使用ILog界面的模拟。

此时我决定使用Unity来解决依赖关系。

所以行

ILog _log = LogManager.GetLogger(); 

看起来像

ILog _log = Resolver.Instance.Resolve<ILoger>(); 

的问题是如何建立统一的容器返回我使用日志管理工厂的ILog对象的新实例。

谢谢。

P.S. ILog是log4net接口,现在使用log4net实现整个日志记录。

回答

1

这里的问题是你没有遵循好莱坞原则。静态工厂方法和单例不适合依赖注入。你应该改变你的代码,以注入ILog的工厂:

public class CommonFileSaver : IFileSaver 
{ 
    public CommonFileSaver(ILogFactory logFactory) 
    { 
     _log = logFactory.GetLogger(); 
    } 

    private readonly ILog _log; 

    ..... 
} 
+0

这看起来很合适,谢谢。 – v00d00 2011-02-01 11:15:48

1

你可以编写一个log4net的包装器(无论如何,这是一个不错的主意)。包装将负责通过使用log4net工厂方法创建实例,并确保调用“配置”方法。

如果你写一个包装,你可能想要考虑这个information

1

如果您试图实现的目标是使用模拟ILog测试日志记录过程,当我建议您也嘲笑LogManager并设置GetLogger的期望以便它将返回模拟的ILog 。

+0

谢谢你的伟大的评论。 – v00d00 2011-02-01 11:17:18

2

也许它不是设计是正确的,但使用厂家有可能在团结...

_container = new UnityContainer(); 
_container.RegisterType<ILog>(new InjectionFactory(c => LogManager.GetLogger())); 
+0

对我来说足够好:) – 2011-02-01 21:41:41

相关问题