2009-08-04 5 views
6

Entity Frameworkで使用する代替パターンは何ですか?私が知っているEntityFrameworkを使用するためのパターン?

いくつかは以下のとおりです。

  1. "プレーン" EntityFramework - 別名作業 のユニティ

     
    using (Data.Model c = new Data.Model()) 
    { 
        var z = c.Users.Where(x=>x.Name=='John'); 
    }

  2. リポジトリパターン

     
    //Model implements IRepository 
    User user = Model.Instance.Get<User>(u => u.Name == "John"); 
    

  3. 他に何が?
+0

少し混乱するので、質問のタイトルを変更することをお勧めします。タイトルは、Entity Frameworkの使用方法と代替案(つまり、使用しない方法)についての全体的な説明です。 –

+0

は実際にはありません。 私はEFを正確に使用する方法を取得しようとしています。 私はEFのための代替手段が必要ないことを意味します。私は、EFに基づいたさまざまなパターンを使用するための単なる可能な方法が必要です。 – bug0r

答えて

2

見るべき良い本はMartin Fowlerの"Patterns of enterprise application architecture"です。

そこでは、DTO、作業単位、リポジトリパターンなどのデータを取得/マッピングするためのいくつかのパターンがあります。おそらく、Entity Frameworkと一緒に役に立つものがあるかもしれません。私はそれを見なければならないだろう。

0

作業ユニットの例と同様のコードを使用します。

さらに、データ転送オブジェクトにオブジェクトをマップすることもできます。

0

多くの記事が掲載されていますが、好きなものがあればリストは大幅に減ります。 This article from MSDN Magazineは非常に優れていますが、特にn層アプリケーションを扱っています。しかし、あなたが作っていることを言っていないので、おそらく助けになるかもしれません。

1

私はあなたがあなたのUI /コントローラ/サービスに直接Entity Frameworkのを使用しているという仮定に基づいて、あなたの質問に答えます。

EFを含む任意のORMをUI /コントローラ/サービスに直接使用すると、将来的に多くの問題が発生することが証明されています。さらに、不可能ではないにせよ、アプリケーションの単体テストを非常に難しくしています。

モデルとレポジトリは異なる責任を持ち、SOLID原則の「単一責任」の部分に基づいて、2つの概念を併合してはならないため、「モデル実装リポジトリ」も間違っています。あなたのモデルでアクティブオブジェクトパターンを使用することをお勧めしますが、使用しているORMからモデルを切り離す必要があります。

IRepositoryやIRepositoryのようなインターフェースを、パターンの示すように非常に基本的なメンバーと組み合わせることをお勧めします。

Interface IRepository<T> where T:class 
{ 
    void Insert(T entity); 
    void Update(T entity); 
    void Delete(T entity); 

    // if you don't want to return IQueryable 
    T FindById(object id); 
    IEnumerable FindXXXXX(params) 

    // if you prefer to return an IQueryable 
    IQueryable<T> Find(Expression<Func<T, bool>> predeicate); 
} 

一部のポープルbeleiveリポジトリはIQueryableを返すべきではないことに注意してください。さらに、式とラムダの代わりにISpecificationを使用することもできます。

ほとんどのエンティティに対してIRepositoyインターフェイスを実装する必要があります。この方法を使用すると、単体テストを書くときにリポジトリをモックすることもできます。本番環境では、Unity、Ninject、Linfu、CatsleなどのIocプロバイダを使用する必要があります。特定のIoCフレームワークへの結合を避けるために、Microsoftの一般的なサービスロケータの実装を利用することもできます。

私は以前、特定のビジネスドメインまたはサービスに対してインプリメントされたデータアクセスインターフェイスを使用していました。このアプローチの問題の1つは、ソースコードを把握していれば、最終的には別のデータアクセスサービスでコードが重複してしまうことです。

関連する問題