2011-01-08 10 views
1

私はDIとIoCのコンテナをよく理解していますが、実際に何十種類ものクラスを複数の "モジュール"(DLLなど)で扱う方法は不明です。私がIoCで見たほとんどすべての例は、ほんの一握りのクラスを使い、Mainメソッド(またはWebアプリケーションの場合はGlobal.asax)でコンテナを手動で設定します。すべてを設定するために何百もの行がFor<I>().Use<T>()構文を使用しているだけです。"現実の世界"のIoC - 多くのクラスを扱う方法?

これはレジストリ(StructureMap)クラスとカーネル(Ninject)クラス(これは私がよく知っている2つのIoCコンテナなので、他のIoCコンテナにも同様のことがあると思います)。

私の質問は、あなたのアプリケーション(リポジトリ、エンティティ、サービスなど)の各グループに対応する別のレジストリを作成しようとしていますか(私はその命名法を守るためにStructureMapで遊んでいます) 「インフラストラクチャー」クラス・ライブラリーとし、そのメイン・アプリケーション・エントリー・ポイントでそれらのクラスを結び付けようとしていますか?私はあなたがさらに行くことができ、それぞれの集約(DDD用語を使用する)のための1つのレジストリを持っていると仮定して、それらのすべてをアプリケーションの全セクションを包含するさらに広いレジストリクラス(例えば、より大きなLOBアプリケーションのCRM部分)複数の集約がある場合は、各集計ごとに1つのレジストリ配線を作成し、集計レジストリをすべて結合した大きなレジストリを作成してください。

基本例:

// MyApp.Infrastructure 
class ServiceRegistry : Registry 
{ 
    public ServiceRegistry() 
    { 
     For<IOrderService>().Use<OrderService>(); 
     // other services... 
    } 
} 

class RepositoryRegistry: Registry 
{ 
    public RepositoryRegistry() 
    { 
     For<IOrderRepository>().Use<OrderRepository>(); 
     // other repositories... 
    } 
} 

// other registry files e.g. for Entities 

// Global.asax or Program.cs or whatever entry point 
ObjectFactory.Initialize(x => { 
    x.AddRegistry<ServiceRegistry>(); 
    x.AddRegistry<RepositoryRegistry>(); 
    // other registries 
}); 

これは、論理的に組織化された何十というクラスであっても数十ものアプリケーションを処理するための好ましい方法ですか?

答えて

1

StructureMapには、レジストリアグリゲータが既に用意されています。 scanning assembliesに関するStructureMapのドキュメントをご覧ください。 アセンブリごとにレジストリを作成する必要があります(単一のアセンブリで複数を実行できますが、明らかなメリットはありません)。

次に、スキャン機能を使用してすべてのレジストリを見つけることができます。また、各実装を明示的に登録する必要がないように、登録規則(Scan()句内)を使用することもできます。

ObjectFactory.Initialize(x => { 
    x.Scan(s => { 
    // Add the current assembly 
    s.TheCallingAssembly(); 

    // Add all assembly from a specified path 
    s.AssembliesFromPath("Extensions"); 

    // Automatically look and execute registries 
    s.LookForRegistries(); 

    // specify some conventions 
    s.WithDefaultConventions(); 
    }); 
}); 
0

私はSpringを使うと、レイヤーごとに別々の設定ファイル(Web、サービス、永続性など)を持っています。すべてのレイヤー技術と同様に、これらは論理的に1つの場所にグループ化して関係を明確にする構成を保持します。

すべてのコンピュータサイエンスで共通しているのは、複雑さを小さくして管理しやすいチャンクに分解することで複雑さを処理することです。

0

Fowlersのデザインパターンエンタープライズアプリケーションから来ていますが、レジストリの名前も混乱することがあります。エントリポイントをアプリケーションのコンポジションルートと呼ぶことも考えられます(Marc Seemans .NET Dependency Injection、manningからの書籍参照)。 とにかく、アプリケーションごとにコンポジションルートを持つ必要があります。アプリケーション間でコンポジションルートを共有するのではなく、それらのインターフェイスとインターフェイスを結びつけないようにする必要があります。

このような大規模なプロジェクトのためにいくつかの意味:)

4

を作った希望は、あなたはおそらく設定より規約を優先したいと思います。たとえば、StructureMapにはデフォルトのコンベンショナルスキャナがあります。カスタムスキャナを作成することもできます。ここで見てください:http://codebetter.com/jeremymiller/2009/01/20/create-your-own-auto-registration-convention-with-structuremap/

したがって、一般的にはコンストラクタインジェクションを使用し、IoCブートストラップは、特定のアセンブリ内のインターフェイスの実装を正確に見ることができます。そのアセンブリをスキャンするように設定すると、自動的にコンストラクタの依存関係を作成します。

0

IoCの「自動配線」機能を使用すると便利です。例えばインターフェイスの実装を別のアセンブリに分けて、1つのバージョンのみを配布する場合、IoCコンテナは適切な実装を自動的に見つけることができ、コンテナを解決するときにどの実装を使用するべきかを手動でコンテナに伝える必要はありません依存。

これはSpring.NetStructureMapsで「オートワイヤリング」(byType、byNameなど)と呼ばれています。

関連する問題