1

Windsorを使用して新しいプロジェクトに着手しようとしていますが、クラスAがクラスBをインスタンス化する必要があるシナリオに遭遇することを考えていましたが、WindsorがクラスBのインスタンスをに注入することは不可能または不可能です。それ。私はシナリオを考えるのに苦労していますが、ここに行きます:

WCFサービスに渡されるビジネスエンティティ「顧客」があるとします。このクラスにはEnt.Lib自己検証メソッドがあり、このメソッドはヘルパークラス「CustomerValidator」を使用します。サービスによって受信されたCustomerオブジェクトはWCFによって逆シリアル化されているため、Windsorはそのインスタンス化に関与しないため、依存関係を注入することはできません。また、CustomerValidatorを自己検証メソッドに渡すこともできません。これは、Ent.Libの特定の署名に従う必要があるためです。では、このクラス/メソッド内でCustomerValidatorをインスタンス化するにはどうすればよいですか?単に「 varcv=new CustomerValidator(); 」を実行するのではなく、Windsorを利用したいのです。

これは、Customerクラスに検証メソッドを含めるのではなく、Customerオブジェクトを検証メソッドに渡すなど、さまざまな方法で解決できるため、優れた例ではありませんが、議論のための可能なシナリオを提供します。

WindsorContainerをパブリックシングルトンとして公開し、それを必要とする任意のコードからアクセスできますが、それは眉をひそめているようです。他に何か提案はありますか?

4

1 に答える 1

2

他のクラスからコンテナを参照する必要がありますか?

いいえ。コンテナを参照することで、複雑で不要な依存関係をクラスに追加します。これにより、テストが複雑になり、複雑さが増します。

サービスによって受信されたCustomerオブジェクトはWCFによって逆シリアル化されているため、Windsorはそのインスタンス化に関与しないため、依存関係を注入することはできません。

これがあなたが進むべき方向だと思います。依存関係を注入できるように、逆シリアル化を制御する方法が本当にないかどうかを調べてみてください。

それが失敗した場合は、 http://commonservicelocator.codeplex.com/の使用を検討してください。Windsorアダプタを使用したMicrosoftのサービスロケーションの実装が利用可能です。これは基本的にコンテナを参照する場合と同じパターンですが、特定のコンテナ実装への依存関係を導入しません。また、テストのためにモックする方が簡単だと思います。

于 2012-04-26T21:00:42.713 に答える