我有一个LogManager类,它具有一个类型参数,可以像这样给log4net:
public class LogManager<T> : ILogManager
{
private ILog Logger { get; set; }
public LogManager()
{
Logger = LogManager.GetLogger(typeof(T));
}
}
我将此记录器注册为有条件的:
container.RegisterConditional(typeof(ILogManager),
c => typeof(LogManager<>).MakeGenericType(c.Consumer.ImplementationType),
Lifestyle.Transient,
c => true);
它按照预期的方式工作,我将日志管理器注入到控制器的构造器中并使用它。但有一个问题。我有很多单例类也应该使用日志管理器,但是我不能将其注入它们,因为日志管理器的寿命比其他人短,因此Simple Injector不允许我这样做。
提出的解决方案是将日志工厂类注入其他单例并在每次听起来都不好的想法时调用工厂。我不想每次想记录某些内容时都执行_logFactory.GetLogger()。Debug(“ log”)。还是我缺少有关此解决方案的信息?
另一种建议的解决方案是使单例类成为瞬态,这没有任何意义。
有什么建议我应该如何进行?我的设计有什么问题吗?
最佳答案
您应该使注册单身:
container.RegisterConditional(typeof(ILogManager),
c => typeof(LogManager<>).MakeGenericType(c.Consumer.ImplementationType),
Lifestyle.Singleton,
c => true);
由于
LogManager<>
是通用类型,因此Simple Injector将为每个封闭的通用版本创建一个实例。因此,LogManager<HomeController>
是与LogManager<UsersController>
不同的实例。这仅仅是因为无法使用同一实例(在.NET中是不可能的)。因此,每个使用者仍将拥有自己的LogManager<T>
,并具有自己的log4net ILog
实现。从log4net的LogManager.GetLogger
返回的记录器是线程安全的,这就是为什么让您自己的LogManager<T>
单身人士没问题的原因。