これを解決するかなり簡単な方法は、カスタム Autofac モジュールを使用することです。
まず、モジュールを実装し、IComponentRegistration.Preparing イベントを処理します。これは、パラメーターの値を保存する場所でもあります。
using System;
using Autofac;
using Autofac.Core;
public class LangModule : Module:
{
private string _lang;
public LangModule(string lang)
{
this._lang = lang;
}
protected override void AttachToComponentRegistration(
IComponentRegistry componentRegistry,
IComponentRegistration registration)
{
// Any time a component is resolved, it goes through Preparing
registration.Preparing += InjectLangParameter;
}
protected void InjectLangParameter(object sender, PreparingEventArgs e)
{
// Add your named parameter to the list of available parameters.
e.Parameters = e.Parameters.Union(
new[] { new NamedParameter("lang", this._lang) });
}
}
カスタム モジュールが作成されたので、それを他の依存関係と共に登録し、注入する値を提供できます。
var builder = new ContainerBuilder();
builder.RegisterModule(new LangModule("my-language"));
builder.RegisterType<LangConsumer>();
...
var container = builder.Build();
文字列パラメーター「lang」を持つ型を解決すると、モジュールは指定した値を挿入します。
より具体的にする必要がある場合は、イベント ハンドラーで PreparingEventArgs を使用して、どの型が解決されているか ( e.Component.Activator.LimitType
) などを判断できます。その後、パラメーターを含めるかどうかをその場で決定できます。