web-dev-qa-db-ja.com

コンテナが構築された後にサービスを追加する

実行時に、つまりContainerBuilderがビルドされ、Containerが作成された(そしてContainerBuilderが破棄された)後、サービスを登録することは可能ですか?

82
Paul Knopf

はい、できます。UpdateContainerBuilderメソッドを使用します。

var newBuilder = new ContainerBuilder();
newBuilder.Register...;

newBuilder.Update(existingContainer);
95
Peter Lillevold

ContainerBuilder.Updateは非推奨になっているため、新しい推奨事項は子のライフタイムスコープを使用することです。

ライフタイムスコープへの登録の追加

Autofacでは、ライフタイムスコープを作成するときに、「オンザフライ」で登録を追加できます。これは、ある種の「スポット溶接」の制限された登録オーバーライドを行う必要がある場合、またはグローバルに登録したくないスコープに追加のものが必要なだけの場合に役立ちます。これを行うには、ContainerBuilderを取得して登録を追加するラムダをBeginLifetimeScope()に渡します。

using(var scope = container.BeginLifetimeScope(
  builder =>
  {
    builder.RegisterType<Override>().As<IService>();
    builder.RegisterModule<MyModule>();
  }))
{
  // The additional registrations will be available
  // only in this lifetime scope.
}

ライフタイムスコープの操作

9
wezzix