33

だから私はこのコードを持っているとしましょう

var builder = new ContainerBuilder();
builder.RegisterInstance(new MyType());
var container = builder.Build();

それからしばらくMyTypeして、で呼び出される将来のすべての解決のためにのインスタンスを変更したいと思いますcontainer

4

3 に答える 3

48

登録を変更したいときは、新しい を作成しContainerBuilder、新しいインスタンスを登録Updateして、コンテナーに渡す呼び出しを行います。

// at some later point...
builder = new ContainerBuilder();
builder.RegisterInstance(myType2);
builder.Update(container);
于 2010-10-18T04:11:00.787 に答える
20

別の方法として、コンテナによって提供される基になるインスタンスを変更できるデリゲートを登録することもできます。次のコードを検討してください。

 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());

注:インスタンスを変更する必要がある時期理由を詳しく説明できれば、より良い解決策を見つけることもできます。

于 2010-10-18T11:38:33.750 に答える
1

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

于 2019-01-22T06:24:48.607 に答える