私はWebアプリケーション(主にMVC3のNinject)でIoC/DIに慣れています。私のコントローラは、私のために作成され、すべての依存関係、サブ依存関係などで埋められます。Windowsクライアント(WPF)アプリケーションでの依存性注入を行う適切な方法
しかし、シッククライアントアプリケーションでは事柄が異なります。私自身のオブジェクトを作成する必要があります。または、サービス・ロケーター・スタイルのアプローチに戻って、依存性を持つオブジェクトを私に与えるためにカーネルに(恐らくいくつかのインターフェースを介して)テストすることができます。
しかし、私はService Locatorがアンチパターンとして記述されている場所をいくつか見てきました。
私の厚いクライアントアプリでNinjectのメリットを享受したい場合は、これを得るためのより良い/より適切な方法がありますか?可能なカップリングの
- テスト容易
- 適切DI/IoCの
- 最低額は
私はちょうどここMVVMについて話してビューにビューモデルを取得しておりませんのでご注意ください。これは、カーネルからリポジトリタイプのオブジェクトを提供し、そのリポジトリからフェッチされたエンティティに機能が注入されている必要があることによって特にトリガされます(もちろん、データベースのデータですが、状態に応じていくつかのオブジェクトもパラメータとして必要ですNinjectはそれをどのように提供するかを知っています)。私はどうにかして、両方のリポジトリとエンティティをuntestable messesとして残さずにこれを行うことはできますか?
不明な点がある場合は、お知らせください。ありがとう!
EDIT 7月14日
は、私が提供する2つの答えは、おそらく正しいことを確信しています。しかし、私の体のすべての繊維はこの変化と戦っています。その中には知識の不足が原因のものもありますが、このようなやり方の優雅さを見るのが難しい理由の1つがあります。
私はこれを元の質問で十分に説明していませんでしたが、いくつかの(最初は多分、おそらく後で)WPFクライアントアプリケーションで使用されるライブラリを作成しています。これらのアプリケーションはすべて同じドメインモデルなどで動作するため、DRYを維持する唯一の方法は、すべてを1つのライブラリに保存することです。しかし、このシステムの顧客が自分のクライアントを書く機会もあります。私は、彼らに話すシンプルできれいな図書館を持たせたいと思っています。私はMyCrazySystemAdapter()を新しく作成し、それを使っているのと比べて、難解なことを複雑にしているため、Composition RootでDIを使用することを強制したくありません(Mark Seemanと同じ言葉を使っています)。
ここでMyCrazySystemAdapter(私がここで私の意見に同意しないため選択した名前)は、サブコンポーネントで構成し、DIを使用して組み立てる必要があります。 MyCrazySystemAdapter自体を注入する必要はありません。これは、クライアントがシステムと通信するために使用する必要のある唯一のインターフェイスです。クライアントは喜んでそれらの1つを取得する必要があり、DIはシーンの裏にある魔法のように起こり、オブジェクトはベストプラクティスと原則を使用してさまざまなオブジェクトによって構成されます。
私はこれが物事をしたいという議論のある方法になることを認識しています。しかし、私はこのAPIのクライアントになる人も知っています。彼らがDIシステムを学び、結びつけて、アプリケーションエントリーポイント(Composition Root)でオブジェクトの構造全体を作成する必要があることがわかったら、単一のオブジェクトを新しくするのではなく、中指とデータベースを直接混乱させて、想像がつかないように物事を台無しにする。
TL; DRは:適切に構造化されたAPIを提供することは、クライアントのためのあまり面倒です。私のAPIは、DIと適切なプラクティスを使用して舞台裏で構築された単一のオブジェクトを提供する必要があります。現実の世界は、パターンや実践に真実を保つために、あらゆることを後方に構築したいという欲求よりもはるかに優れています。
-1あなたの 'GetStuff()'はドレスのサービスロケータです。これをしないでください。 (あなたの答えの残りの部分には何も問題はありませんが、SLnessはそれをirellevantにします) –
Ruben、そうです。私は私の答えを修正しました! –
Remoの答え(私が正しいアプローチだと思う)を見る前に、私は工場の注入を提案するつもりでした(Funcsとして適切な場合はhttp://stackoverflow.com/questions/4840157/does-ninject-support- func-auto-generated-factory/4851885#4851885) –