コンテナの構築後にサービスを追加する


87

実行時に、つまり、ContainerBuilderが構築され、Container作成(およびContainerBuilder破棄)された後にサービスを登録することは可能ですか?


現在、ベストプラクティスはAutoFacコンテナが言う不変です
アディ

回答:


96

はい、できます。次のUpdate方法を使用してくださいContainerBuilder

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

newBuilder.Update(existingContainer);

2
解決にすでに使用されている既存のコンテナを更新すると、動作が不確定になる可能性があることに注意してください。たとえば、すでに解決されたシングルトンの依存関係であるコンポーネントを置き換えると、元のコンポーネントは参照されたままになります。
スティーブン

13
アップデートは非推奨ですgithub.com/autofac/Autofac/issues/811
チェイスフロレル2017年

19

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.
}

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


注意すべきことは、usingブロックのコメントです。「追加の登録は、このライフタイムスコープでのみ利用可能になります。」
アディ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.