codecampserver の StaticFactory<T> はよく知られたパターンですか?
質問
CodeCampServer のソース コードには汎用のコードが含まれています 静的ファクトリー.
これは、フレームワークが依存関係の注入とうまく機能するメカニズムの重要な部分であると推測しています。
そのサブクラスは、DefaultUnconfiguredState を使用して、依存関係解決メカニズムが動作するものに置き換えることができる、自分自身のデフォルト未構成状態への静的アクセスを提供します。
これに関するドキュメントは見つかりませんでした...
に良い説明はありますか 本?(Amazonからの発送待ちです…)
...または、これが何なのか、そしてこのパターンを採用するのが賢明かどうか (もしそれが 1 つである場合...) について、他の誰かが適切な解説を提供してもらえますか?
アップデート
Jeffrey Palermo がこの質問に回答したので、MVC2 in Action の (進行中の) 原稿で、このパターン/スタイルが議論され、ドメイン層を認識しないようにリポジトリを見つけるために使用されるファクトリを使用して説明されていることがわかります。持続性に関する懸念。(見る 第23章).
デフォルトでは、このファクトリを使用すると例外がスローされます。
「リポジトリを作成する方法の知識は、工場に存在しません。この工場は、単にリポジトリを返す機能を表しているだけです」
この例では、リポジトリ インターフェイスの具体的な実装を初期化するために、いくつかのメカニズムのうちの 1 つを使用できた可能性があります。この本の例では、簡素化のために IOC コンテナを使用せず、一部の起動ロジックで明示的に IOC コンテナを提供しています。
「重要なことは、コアプロジェクトもUIプロジェクトも、本質的に純粋にインフラストラクチャのインフラストラクチャプロジェクトまたはライブラリを参照する必要がないことです。私たちは、アプリケーションの残りの部分がデータアクセスがどのように発生しているかを気にしないように、nhibernateを完全に側面に留めました」
この新しい章のサンプル コードに関して注意すべき最後の点は、Factory が静的ではなくなっていることです (少なくとも、外部に面しているインターフェイスに関する限り)。
アップデート 2
パレルモ氏がブログでさらに詳しく書いています Abstract Factory のこの特定のスタイル (OrderShipperFactory の実装を参照)。
私もできました 「手動依存性注入」を検討してください。 (ボブおじさん)。
アップデート 3 - 2016 年 3 月
あるよ 別の例はこちら, ただし、Jeffrey はこれがデモ コードであることを明言しており、コメントは、これが Mark Seeman が呼ぶもので構成されることを示しています。 構成ルート (すなわち、アプリケーション起動時)
私はジェフリーの記事でこれを発見しました。オニオンアーキテクチャ:パート 4 - 4 年後"
解決
良い質問。私もそれは好きではありません。本当は「StartupFactoryConfiguration」という名前になるはずですが、リファクタリングリストに載っています。
私たちは、コンテナ経由でコンストラクター インジェクションを受けていない場所に DI を設定する方法として、このアイデアを試してみました。
それは消えてしまいます。アンチパターンが何かはわかりませんが(名前は何ですか?)、StaticFactory は停止します。
今朝付けで名前が変わりました。現在は AbstractFactoryBase です。これは、Abstract Factory パターンの実装です。 http://en.wikipedia.org/wiki/Abstract_factory_pattern
ファクトリの実装は最終的に IoC コンテナを呼び出すことになりますが、アセンブリ参照なしでコード内の任意の場所から IoC コンテナ アセンブリにアクセスできるようになります。
よろしく、ジェフリー・パレルモ
他のヒント
静的なものはすべて DI の敵です。
この StaticFactory は、 サービスロケーター (アンチ)パターン。
Service Locator はアンチパターンであると考えています。これは、どの依存関係を適切に配置する必要があるかが API のユーザーに対してまったく不明瞭であるためです。したがって、Service Locator がスローするコンテキストでオブジェクトのメソッドを簡単に呼び出すことができますが、API はこれが当てはまるという手がかりをまったく与えません。
の多用など適切なDI コンストラクターのインジェクション より良い代替手段です。