シンプルにまとめるのがベストだと思いますが、おそらく次のようなものです。
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>
に のパラメーターなしのコンストラクターが必要ですが、これもadd メソッドActivator
の一般的な制約で保証されます。new()