2

このコードでは:

container.Register<IDataHoldingSession<DbContext>, EntityFrameworkSession>();
container.RegisterAll<ISession>(typeof(IDataHoldingSession<DbContext>));
container.RegisterDecorator(typeof(IDataHoldingSession<>), typeof(ValidatingSession<>));

コンテナに が要求されるとIEnumerable<ISession>、 を含むコレクションが与えられますEntityFrameworkSessionが、デコレータは適用されません。上記のコードでデコレータを適用するにはどうすればよいですか?

これは、コンテナが要求されていないために発生すると思いますIEnumerable<IDataHoldingSession<T>>RegisterAllこの場合、コンテナーが のインスタンスを要求されることを意味するものとしてXML ドキュメントを解釈しますIDataHoldingSession<DbContext>。これにより、デコレーターが適用されるはずです。ただし、サービスタイプRegisterAllで呼び出されるため、この状況ではデコレータがバイパスされているようです。ISession

4

2 に答える 2

2

Simple Injector での登録には、次の 2 つの部分が含まれます。

  1. アンInstanceProducer。これは、インスタンスを生成するオブジェクトであり、インスタンスの傍受と装飾を担当します。は登録の を認識せず、 のみを認識InstanceProducerします。TImplementationTService
  2. はオブジェクトをInstanceProducerラップしRegistrationます。このオブジェクトは、インスタンスを作成し、コンストラクター注入、プロパティ注入、カスタム初期化を行い、ライフスタイルを式に適用する Expression の構築を担当します。(Registrationのみ) は について知っていTImplementationます。

登録を行うときRegisterAllは、コンテナーで行われる他の登録を参照する型を指定します。これを行うには、両方を実行し、登録Register<IDataHoldingSession<DbContext>>でそのインターフェイス タイプを使用します。RegisterAll

カバーの下で行うことRegisterAllは、コンテナに特定のタイプの登録を照会することです(あなたの場合はIDataHoldingSession<DbContext>)。要求されたタイプはコレクションのサービス タイプとは異なる可能性があるため (通常はそうであり、あなたのケースではそうです)、コンテナRegistrationは見つかったものから を取得し、コレクションの実際のサービス タイプでそれに基づいてInstanceProducer新しいものを作成します。これは、Simple Injector のソース コード ( 内)では次のようになります。InstanceProducerRegistrationContainerControlledCollection

return new InstanceProducer(typeof(TService), instanceProducer.Registration);

しかし、デコレータは によって適用されるためInstanceProducer、適用したデコレータは失われますIDataHoldingSession<T>

率直に言って、なぜこのような動作を実装したのかわかりません。なぜなら、最も直感的な動作ではデコレータをIDataHoldingSession<T>引き続き適用できるからです。デコレータが 2 回適用されるのを防ごうとしたと思います。これは、Simple Injector の以前のリリースでの問題でした。

これを調べて、v2.4 の修正を考え出すことができるかどうかを調べてみますが、互換性を破る変更を導入しない場合にのみこれを行うことができます。それまでの間、回避策は非常に優れていると思います。私が修正を加えたら、おそらくあなたが今行っているように内部的に実装するでしょう。

Simple Injector が期待どおりに機能していないことをお詫び申し上げます。

アップデート:

この問題を修正するメイン ブランチのバグ修正をチェックインしました。v2.4リリースには、この修正が含まれています。

于 2013-10-29T10:05:31.683 に答える