4

選択した IoC コンテナー ライブラリ (Unity) からすべてのコードを分離したいと考えています。そのために、Register() と Resolve() を公開する IContainer インターフェイスを作成しました。IContainer を実装し、実際のコンテナーをラップする UnityContainerAdapter というクラスを作成しました。したがって、UnityContainerAdapter が定義されているアセンブリのみが Unity ライブラリについて認識します。

私の孤立思考に漏れがあります。Unity は、依存関係を注入する場所を知るために、型のメンバーの属性を検索します。私が見たほとんどの IC ライブラリもそれをサポートしています。私が抱えている問題は、その機能を使用したいのですが、クラスが Unity 固有の属性に依存することを望まないことです。

この問題を解決する方法について何か提案はありますか?

理想的には、独自の [Dependency] 属性を作成し、それをコードで使用します。しかし、実際のコンテナに、自分の属性ではなく自分の属性を検索するように指示する必要があります。

4

3 に答える 3

4

Common Service Locatorプロジェクトを確認してください。

Common Service Locator ライブラリには、アプリケーションおよびフレームワークの開発者が参照できるサービス ロケーションの共有インターフェイスが含まれています。このライブラリは、IoC コンテナーとサービス ロケーターの抽象化を提供します。ライブラリを使用すると、アプリケーションはハード参照に依存せずに機能に間接的にアクセスできます。このライブラリを使用することで、サードパーティのアプリケーションとフレームワークが特定の実装に縛られることなく、IoC/Service Location を活用できるようになることが期待されています。


編集:これは、依存性注入の属性ベースの宣言を使用したいというあなたの欲求を解決するようには見えません。使用しないことを選択するか、属性を複数のインジェクション ライブラリに抽象化する方法を見つけることができます (前述のように)。

これが宣言型インターフェースの基本的な問題です。それらは特定の実装に結び付けられています。

個人的には、コンストラクター インジェクションに固執するので、この問題には遭遇しません。

于 2009-06-29T16:50:47.907 に答える
3

私は答えを見つけました: Unity は拡張機能を使用して、「セレクター ポリシー」と呼ばれるものを構成します。Unity が使用する属性を置き換えるには、独自のバージョンの UnityDefaultStrategiesExtension クラスをコーディングし、独自の属性を使用する独自の「セレクター ポリシー」を登録するだけです。

その方法の詳細については、Unity codeplex サイトのこの投稿を参照してください。

別の IoC ライブラリに切り替えた場合に同じことが簡単にできるかどうかはわかりませんが、今のところ問題は解決しています。

于 2009-07-03T17:12:41.253 に答える
0

xmlで、属性なしで構成をセットアップすることはできませんでした。それは私が知っているもう少し「不明確」になります、個人的に私はxmlと属性の組み合わせを使用します、しかし少なくともそれはあなたの統一性への依存を「解決」します。

于 2009-07-01T10:55:30.170 に答える