30


7

Autofacでは、Buildが呼び出された後に登録されたインスタンスを変更するにはどうすればよいですか?

だから私はこのコードを持っていると言うことができます

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

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

3 Answer


47


登録を変更したい時点で、新しい ContainerBuilder`を作成し、新しいインスタンスを登録し、コンテナーに渡して Update`を呼び出します。

// at some later point...
builder = new ContainerBuilder();
builder.RegisterInstance(myType2);
builder.Update(container);


20


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

 var theInstance = new MyType();
 var builder = new ContainerBuilder();
 builder.Register(context => theInstance);
 builder.Register>(context => newInstance => theInstance = newInstance);
 var container = builder.Build();

これで、アクションを解決して、登録を変更できるデリゲートを取得できます。

 var updateInstance = c.Resolve>();
 updateInstance(new MyType());

*注:*インスタンスを変更する必要がある_when_および_why_について詳しく説明できる場合は、おそらくより良い解決策を見つけることができます。


0


Autofac Lifetimeイベント「OnActivating」を使用して、メモリ内に独自のコントローラーオブジェクトを作成して、解決されたインスタンスを置き換えることもできます。

builder.Register(c => c.Resolve())
       .OnActivating(e => e.ReplaceInstance(new TInterfaceSubclass()));