6

Entity Framework を使用する代替パターンは何ですか?

私が知っているものは次のとおりです。

  1. "Plain" EntityFramework - 別名 Unity of Work

    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. ほかに何か ?
  4. ?
4

5 に答える 5

2

Martin Fowler の「エンタープライズ アプリケーション アーキテクチャのパターン」は参考になる書籍です。

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

于 2009-08-04T10:31:10.140 に答える
1

UI/コントローラー/サービスでEntity Frameworkを直接使用しているという前提に基づいて、質問に答えます。

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

モデルとリポジトリには異なる責任があり、SOLID原則の「単一の責任」の部分に基づいているため、2つの概念を一緒にマージしないでください。モデルで Active Objects パターンを使用したい場合でも (これはお勧めしません)、使用する 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);
}

一部の人々は、リポジトリが IQueryable を返すべきではないと信じていることに注意してください。さらに、式とラムダの代わりに ISpecification を使用することを検討できます。

ほとんどのエンティティに IRepositoy インターフェイスを実装する必要があります。このアプローチを使用すると、単体テストを作成するときにリポジトリをモックすることもできます。運用環境では、Unity、Ninject、Linfu、Catsle などの Ioc プロバイダーを使用する必要があります。特定の IoC フレームワークへの結合を回避するために、Microsoft の共通サービス ロケーターの実装を利用することもできます。

昔は、特定のビジネス ドメインやサービス用に実装されたデータ アクセス インターフェイスがありました。このアプローチの問題点の 1 つは、ソース コードを追跡すると、異なるデータ アクセス サービスでコードが重複してしまうことです。

于 2011-04-16T23:51:50.590 に答える
0

作業単位の例にあるものと同様のコードを使用します。

さらに、オブジェクトをデータ転送オブジェクトにマップします。

于 2009-08-04T10:26:17.780 に答える
0

LINQ 2 SQL は代替手段になる可能性があります。Unity と Linq を使用した依存性注入の記事を次に示します。SQL DataContexts

ユニティ - http://unity.codeplex.com/

于 2009-08-05T16:55:34.460 に答える