Simple Injector での登録には、次の 2 つの部分が含まれます。
- アン
InstanceProducer
。これは、インスタンスを生成するオブジェクトであり、インスタンスの傍受と装飾を担当します。は登録の を認識せず、 のみを認識InstanceProducer
します。TImplementation
TService
- はオブジェクトを
InstanceProducer
ラップしRegistration
ます。このオブジェクトは、インスタンスを作成し、コンストラクター注入、プロパティ注入、カスタム初期化を行い、ライフスタイルを式に適用する Expression の構築を担当します。(Registration
のみ) は について知っていTImplementation
ます。
登録を行うときRegisterAll
は、コンテナーで行われる他の登録を参照する型を指定します。これを行うには、両方を実行し、登録Register<IDataHoldingSession<DbContext>>
でそのインターフェイス タイプを使用します。RegisterAll
カバーの下で行うことRegisterAll
は、コンテナに特定のタイプの登録を照会することです(あなたの場合はIDataHoldingSession<DbContext>
)。要求されたタイプはコレクションのサービス タイプとは異なる可能性があるため (通常はそうであり、あなたのケースではそうです)、コンテナRegistration
は見つかったものから を取得し、コレクションの実際のサービス タイプでそれに基づいてInstanceProducer
新しいものを作成します。これは、Simple Injector のソース コード ( 内)では次のようになります。InstanceProducer
Registration
ContainerControlledCollection
return new InstanceProducer(typeof(TService), instanceProducer.Registration);
しかし、デコレータは によって適用されるためInstanceProducer
、適用したデコレータは失われますIDataHoldingSession<T>
。
率直に言って、なぜこのような動作を実装したのかわかりません。なぜなら、最も直感的な動作ではデコレータをIDataHoldingSession<T>
引き続き適用できるからです。デコレータが 2 回適用されるのを防ごうとしたと思います。これは、Simple Injector の以前のリリースでの問題でした。
これを調べて、v2.4 の修正を考え出すことができるかどうかを調べてみますが、互換性を破る変更を導入しない場合にのみこれを行うことができます。それまでの間、回避策は非常に優れていると思います。私が修正を加えたら、おそらくあなたが今行っているように内部的に実装するでしょう。
Simple Injector が期待どおりに機能していないことをお詫び申し上げます。
アップデート:
この問題を修正するメイン ブランチのバグ修正をチェックインしました。v2.4リリースには、この修正が含まれています。