私はILoggerFactory
の実装をAutofacコンテナに登録しました。私はAutofacで次のクラスを登録し、それをインスタンス化することができることができるようにしたい:私は任意のクラスT
ためILogger<T>
の実装のインスタンスを生成するために「教える」Autofacにできるようにする必要があり、そのためにAutofacと汎用インターフェースの工場
public class Test
{
public Test(ILogger<Test> logger)
{
logger.LogInformation("Works!");
}
}
。必要なタイプのインスタンスを生成することができるILoggerFactory
拡張メソッドCreateLogger<T>()
とCreateLogger(Type)
がありますが、それらを呼び出すためにAutofacを作成する方法については私の頭を覆すことはできません。
私は非ジェネリックを望んでいた場合、私は
containerBuilder.Register(c => c.Resolve<ILoggerFactory>().CreateLogger("default"))
を書くと思いますが、私は一般的なもののために何をすべきかわかりません。すべてのポインタ?
更新は:
public class LoggingModule: Autofac.Module
{
private readonly MethodInfo mi;
public LoggingModule()
{
this.mi = typeof(LoggerFactoryExtensions)
.GetMethod(nameof(LoggerFactoryExtensions.CreateLogger), new[] { typeof(ILoggerFactory) });
}
protected override void AttachToComponentRegistration(IComponentRegistry componentRegistry, IComponentRegistration registration)
{
registration.Preparing += OnComponentPreparing;
}
private void OnComponentPreparing(object sender, PreparingEventArgs e)
{
e.Parameters = e.Parameters.Union(
new[]
{
new ResolvedParameter(
(p, i) => IsGenericLoggerParameter(p.ParameterType),
(p, i) => CreateLogger(this.mi, p.ParameterType, i.Resolve<ILoggerFactory>())
)
});
}
private static bool IsGenericLoggerParameter(Type parameterType)
{
return parameterType.IsGenericType && parameterType.GetGenericTypeDefinition() == typeof(ILogger<>);
}
private static object CreateLogger(MethodInfo mi, Type typeArg, ILoggerFactory loggerFactory)
{
Type genericArg = typeArg.GetGenericArguments().First();
MethodInfo generic = mi.MakeGenericMethod(new[] { genericArg });
return generic.Invoke(null, new[] { loggerFactory });
}
}
そして:
containerBuilder.RegisterType<Test>().AsSelf();
containerBuilder.RegisterModule<LoggingModule>();
var container = containerBuilder.Build();
var test = container.Resolve<Test>();
作品documentationいくつかのより多くを読んだ後、私はこれを思い付きました。問題はどのように動作するのか(さらに重要なのはどのように壊れる可能性があるか)を完全には理解できないため、私はまだより洗練された解決策を探しています。
WICHにコードの一部は、あなたが理解していませんか? –
どのようなパラメータがどのように働いているのかわかりません。 – n0rd