2010-12-13 7 views
4

こんにちは 私はDDDに従ってアプリケーションを作成しようとしています。工場でのリポジトリの使い方

 

public class Item 
{ 
     public Category Category { get; protected set; } 

     ... 
} 

public class SpecificItem : Item 
{ 
     ... 
} 

public class Category 
{ 
     public static int IdOfCategoryForSpecificItem = 10; 

     public int Id { get; set; } 
} 

そして今、私はSpecificItem型のオブジェクトを作成する方法と工場を作成したいと思います:私は、次のエンティティを持っているんです。しかし、この特定の項目は特定のカテゴリに属している必要があります。これは、工場や使用リポジトリを作成するための正しい方法です

  1. :?

     
    public class ItemFactory 
    { 
         public static SpecificItem CreateSpecificItem(object someArguments) 
         { 
          IRepository<Category> repository = null // How to get repository? 
    
          return new SpecificItem 
          { 
           Category = repository.FirstOrDefault(i => i.Id == Category.IdOfCategoryForSpecificItem), 
           // additional initialization 
          }; 
         } 
    } 
    

    そして今、私の質問:だから私はこのような工場を作成しましたか

  2. リポジトリを取得するには? DIは静的メソッドなので使用できません。私はServiceLocatorが好きではありません。単体テストが難しいからです。
  3. おそらく、この問題のより良い解決策があります。

答えて

8

ItemFactoryに依存関係注入を使用し、IRepository<Category>にコンストラクタ注入を注入してください。それをやった後、ItemFactoryは次のようになります。

public class ItemFactory 
{ 
    private readonly IRepository<Category> repository; 

    public ItemFactory(IRepository<Category> repository) 
    { 
     this.repository = repository; 
    } 

    public SpecificItem CreateSpecificItem(object someArguments) 
    { 
     return new SpecificItem 
     { 
      Category = this.repository.FirstOrDefault(i => 
       i.Id == Category.IdOfCategoryForSpecificItem), 
      // additional initialization 
     }; 
    } 
} 

この方法は、あなたが呼び出し側にIRepository<Category>の実装を取得する責任を動かしました。これで、ItemFactoryが必要なすべてのタイプで同じことができます。これらの型のコンストラクタには、ItemFactoryを依存として注入します。これをアプリケーションのタイプ階層の一番上までずらして、タイプを構成します(composition root)。

特にIoC/DIフレームワークは、タイプの作成を自動化するのに非常に便利です。

+1

+1 – poindexter12

+0

私は唯一懸念しているのは、集約ルートにパーシスタンスサービスを提供しないため、少なくともDDDの意味ではリポジトリを持っていないように見えるということです。しかし、ORMレベルでリポジトリを使用することは、少なくとも工場の実装が依然としてアプリケーションインフラストラクチャであると私が理解しているので意味があります。 – jpierson

+0

'IRepository'は不変であるべきですか?そうでない場合、factoryは同じ引数に対して異なる結果を生成します。 – astef

0

私はこれが構文上の困惑があなたをより良い解決に導いている時代の1つだと思います。

それぞれのクラスに異なるリポジトリが必要になる可能性があります。これは、DIが行うことができ、静的なプロパティが防止するものです。

しかし、私はここでもあなたの名前を混同していると思います。工場はあるタイプの新しいアイテムを作成しますが、修復物はそのタイプのアイテムを保存/保持します。あなたは創造したり取り戻したりしていますか?

これを分割して新しいファクトリを作成し、既存のファクトリを保存/取得することをお勧めします。 DIを使用して、実行時にタイプに基づいて具体的な実装を決定します。

1

Daoおよびサービスクラスです。 Daoはデータへのアクセスを整理していますが、ServiceはDaoを使用してデータを管理します。それは非常に一般的なスキーマです)サービスクラス
あなたの工場のためのリポジトリを提供する)ダオ・クラスはデータ
2へのアクセスを得ている)サービスクラスは、リポジトリ
3を形成している
1、私は願っています:スキーマがあります私の答えはあなたを助けます。