log4net を必要とするすべてのクラスに登録するために、次のコードを使用します。
public class LogInjectionModule : Module
{
private readonly string _configPath;
public LogInjectionModule(string configPath)
{
_configPath = configPath;
}
protected override void AttachToComponentRegistration(IComponentRegistry registry,
IComponentRegistration registration)
{
XmlConfigurator.Configure(new FileInfo(_configPath));
registration.Preparing += OnComponentPreparing;
}
private static void OnComponentPreparing(object sender, PreparingEventArgs e)
{
var t = e.Component.Activator.LimitType;
e.Parameters = e.Parameters.Union(new[]
{
new ResolvedParameter((p, i) => p.ParameterType == typeof (ILog),
(p, i) => LogManager.GetLogger(t))
});
}
}
すべてのクラスは、autofac の型スキャンを使用して登録されます。
builder.RegisterAssemblyTypes(typeof (IResourceFinder).Assembly)
.AsImplementedInterfaces();
そして、それはうまくいきます!
1 つのクラスを明示的に登録する必要があり、ILog を解決しようとして失敗します
builder.Register(x => new ClassThatNeedsILog(x.Resolve<ILog>())).AsImplementedInterfaces();
これがそのクラスです
public class ClassThatNeedsILog
{
public ClassThatNeedsILog(ILog log)
{
}
}
次の例外が発生します。
Autofac.Core.Registration.ComponentNotRegisteredException : 要求されたサービス 'log4net.ILog' は登録されていません。この例外を回避するには、コンポーネントを登録してサービスを提供するか、IsRegistered() を使用してサービス登録を確認するか、ResolveOptional() メソッドを使用してオプションの依存関係を解決します。