3

CodeCampServer ソース コードには、汎用のStaticFactoryが含まれています。

これは、フレームワークが Dependency Injection でうまく機能するメカニズムの重要な部分であると推測しています。

そのサブクラスは、DefaultUnconfiguredState を使用して静的アクセスを提供します。つまり、依存関係解決メカニズムが動作するものに置き換えることができる Default Unconfigured State への静的アクセスを提供します。

これに関するドキュメントを見つけることができませんでした...

に良い説明はありますか?(Amazonからの発送待ちです…)

...または、これが何であるか、およびこのパターンを採用するのが賢明かどうかについて、他の誰かが良い解説を提供できますか?

アップデート

Jeffrey Palermo がこの質問に答えたので、MVC2 in Action の (進行中の) 原稿で、このパターン/スタイルが説明され、ドメイン層を無視するためにリポジトリを見つけるために使用されるファクトリを使用して示されていることがわかります。持続性の懸念。(第 23 章を参照)。

デフォルトでは、このファクトリを使用すると例外がスローされます。

「リポジトリを作成する方法の知識は、ファクトリにはありません。このファクトリは、リポジトリを返す機能を表すだけです」

この例では、リポジトリ インターフェイスの具体的な実装を初期化するためのいくつかのメカニズムの 1 つを使用できます。本の例では、簡単にするために IOC コンテナーを使用しないことを選択し、一部の起動ロジックで明示的に提供しています。

「重要なことは、Core プロジェクトも UI プロジェクトも、本質的に純粋にインフラストラクチャであるインフラストラクチャ プロジェクトまたはライブラリを参照してはならないということです。アプリケーションの残りの部分がどのようにデータアクセスが発生しています」

この新しい章のサンプル コードに関する最後の注意点は、Factory が静的ではなくなったことです (少なくとも、外部に面したインターフェイスに関する限り)。

更新 2

Palermo 氏は、Abstract Factory のこの特定のスタイルについてさらにブログを書いています(OrderShipperFactory の実装を参照してください)。

「手動依存性注入」 (ボブおじさん)も検討できます。

更新 3 - 2016 年 3 月

ここに別の例がありますが、Jeffrey はこれがデモ コードであることを明示しており、コメントは、これが Mark Seeman がコンポジション ルートと呼ぶもの(つまり、アプリケーションの起動時)で構成されることを示しています。

これは、Jeffrey の記事「Onion Architecture: Part 4 - After Four Years」で発見しました。

4

2 に答える 2

7

良い質問。私も好きじゃない。本当は「StartupFactoryConfiguration」という名前にする必要がありますが、リファクタリング リストに含まれています。

コンテナーを介したコンストラクターの注入を受けていない場所に DI を設定する方法として、そのアイデアをいじりました。

それは消えます。アンチパターンが何かはわかりませんが (名前は?)、StaticFactory は死んでしまいます。


今朝から名前が変わりました。現在は AbstractFactoryBase です。これは Abstract Factory パターンの実装です: http://en.wikipedia.org/wiki/Abstract_factory_pattern

ファクトリの実装は IoC コントレーナーを呼び出すことになりますが、IoC コンテナー アセンブリへのアセンブリ参照なしでコード内の場所からアクセスできます。

よろしく、ジェフリー・パレルモ

于 2009-12-17T14:32:40.773 に答える
5

静的なものはすべて DI の敵です。

この StaticFactory は、Service Locator (アンチ) パターンの実装のように見えます。

Service Locator は、依存関係を設定する必要がある API のユーザーにとって完全に不透明であるため、アンチパターンであると考えています。したがって、Service Locator がスローするコンテキストでオブジェクトのメソッドを簡単に呼び出すことができますが、API はこれが事実であるという手がかりをまったく提供しません。

コンストラクター インジェクションを多用するなどの適切な DIは、はるかに優れた代替手段です。

于 2009-12-17T09:12:36.047 に答える