我有一个静态日志管理器类,它应该根据参数返回所需记录器的实例。
public static class LogManager {
private static ILoggerFactory Factory { ... }
public static ILogger GetLogger(string name) {
return Factory.Create(name);
}
}由于必须设置(初始化) ILoggerFactory的具体实现,所以我想知道是否应该只在每次请求工厂时保持对实现类型的引用并返回一个新实例,或者是否可以保留对实现实例的静态引用。
版本1
private static Type _factoryType;
public static void SetFactory<TFactory>()
where TFactory : ILoggerFactory, new()
{
_factoryType = typeof(TFactory);
}
private static Factory {
get { return (ILoggerFactory)Activator.CreateInstance(_factoryType);
}
public static ILogger GetLogger(string name) {
return Factory.Create(name);
}第2版
private static ILoggerFactory _loggerFactory;
public static void SetFactory<TFactory>()
where TFactory : ILoggerFactory, new()
{
_loggerFactory = (ILoggerFactory)Activator.CreateInstance<TFactory();
}
public static ILogger GetLogger(string name) {
return _loggerFactory.Create(name);
}发布于 2014-08-04 14:59:25
可以说,主要的区别似乎在于延迟加载: v1将在调用GetLogger时创建记录器类型,而v2将在SetFactory期间创建记录器。否则就没有多大区别了。可以将引用作为私有静态字段保留到记录器的类型或工厂本身。
但是,如果这是生产代码,我将完全摆脱这个日志管理器和工厂。相反,我会直接使用日志框架,比如nlog或log4net。这简化了代码并使其更易于维护。在这种情况下,构建抽象是过度工程的。
https://stackoverflow.com/questions/25121335
复制相似问题