だから私はこのコードを持っているとしましょう
var builder = new ContainerBuilder();
builder.RegisterInstance(new MyType());
var container = builder.Build();
それからしばらくMyType
して、で呼び出される将来のすべての解決のためにのインスタンスを変更したいと思いますcontainer
。
だから私はこのコードを持っているとしましょう
var builder = new ContainerBuilder();
builder.RegisterInstance(new MyType());
var container = builder.Build();
それからしばらくMyType
して、で呼び出される将来のすべての解決のためにのインスタンスを変更したいと思いますcontainer
。
登録を変更したいときは、新しい を作成しContainerBuilder
、新しいインスタンスを登録Update
して、コンテナーに渡す呼び出しを行います。
// at some later point...
builder = new ContainerBuilder();
builder.RegisterInstance(myType2);
builder.Update(container);
別の方法として、コンテナによって提供される基になるインスタンスを変更できるデリゲートを登録することもできます。次のコードを検討してください。
var theInstance = new MyType();
var builder = new ContainerBuilder();
builder.Register(context => theInstance);
builder.Register<Action<MyType>>(context => newInstance => theInstance = newInstance);
var container = builder.Build();
これで、アクションを解決して、登録を変更できる代理人を取得できます。
var updateInstance = c.Resolve<Action<MyType>>();
updateInstance(new MyType());
注:インスタンスを変更する必要がある時期と理由を詳しく説明できれば、より良い解決策を見つけることもできます。
Autofac Lifetime イベント「OnActivating」を利用して、メモリ内に独自のコントローラー オブジェクトを保持し、解決済みのインスタンスを次のように置き換えることもできます。
builder.Register<TInterface>(c => c.Resolve<TConcrete>())
.OnActivating(e => e.ReplaceInstance(new TInterfaceSubclass()));
https://autofaccn.readthedocs.io/en/latest/lifetime/events.html#onactivating