我认为最好保持简单,也许是这样的:
public static class LoggerFactory
{
static readonly Dictionary<Type, Type> loggers = new Dictionary<Type, Type>();
public static void AddLoggerProvider<T, TLogger>() where TLogger : ILogger<T>, new()
{
loggers.Add(typeof(T), typeof(TLogger));
}
public static ILogger<T> CreateLogger<T>()
{
//implement some error checking here
Type tLogger = loggers[typeof(T)];
ILogger<T> logger = (ILogger<T>) Activator.CreateInstance(tLogger);
return logger;
}
}
您只需AddLoggerProvider
为您想要支持的每种类型调用 ,可以在运行时进行扩展,它确保您明确地将接口的实现添加到库而不是某个对象,因为 ,所以速度不是很快Activator
,但是创建记录器不会无论如何可能是一个瓶颈。希望它看起来没问题。
用法:
// initialize somewhere
LoggerFactory.AddLoggerProvider<String, StringLogger>();
LoggerFactory.AddLoggerProvider<Exception, ExceptionLogger>();
// etc..
ILogger<string> stringLogger = LoggerFactory.CreateLogger<string>();
注意:每个都ILogger<T>
需要一个无参数的构造函数Activator
,但这也可以通过new()
add 方法中的通用约束来确保。