如何设置统一容器来创建模拟/真实的记录器实例

时间:2011-02-01 09:41:51

标签: c# mocking log4net unity-container

我现在很困惑,也许不明白真正的问题。

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

例如

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

           .....
    }

我希望测试日志记录过程。我目前的决定是使用ILog接口的模拟。

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

所以行

ILog _log = LogManager.GetLogger(); 

看起来像

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

问题是如何设置Unity容器以使用LogManager工厂返回ILog对象的新实例。

谢谢。

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

4 个答案:

答案 0 :(得分:2)

也许它在设计上不正确,但在Unity中可以使用工厂......

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

答案 1 :(得分:1)

你可以为log4net编写一个包装器(无论如何,imho都是个好主意)。包装器将使用log4net工厂方法来创建实例,并且还将确保调用“Configure”方法。

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

答案 2 :(得分:1)

如果我想要实现的目标是使用模拟ILog测试日志记录过程,那么当我建议您同时模拟LogManager并在GetLogger上设置期望时它将返回模拟ILog。

答案 3 :(得分:1)

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

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

   private readonly ILog _log;

   .....
}