我现在很困惑,也许不明白真正的问题。
我有一个对象需要记录器实例来记录错误数据。
例如
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实现整个日志记录。
答案 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;
.....
}