Repositoryモード(zhuan)

2178 ワード

最近多くのASPを発見した.NET MVCの例では、Oxite、ScottGuが最近発表した無料のASP.のようなRepositoryモードが使用されている.NET MVCチュートリアルでは、このモードが使用されています.簡単に見ました.
Enterpriseスキーマ・モデルでは、翻訳者はRepositoryをリポジトリに翻訳します.レルムオブジェクトにアクセスするために使用される類似の集合のインタフェースによって、レルムとデータマッピングレイヤとの間で調整されることを説明します.
「領域駆動設計:ソフトウェアコア複雑性対応の道」では、翻訳者はRepositoryを倉庫に翻訳し、ストレージをカプセル化し、動作を読み取り、検索するメカニズムであり、オブジェクトの集合をシミュレートしていることを示しています.
このモードを使用する最大の利点は、レルムモデルをクライアントコードとデータマッピングレイヤとの間からデカップリングすることです.
LinqToSqlでこのモードをどのように適用するかを見てみましょう.1.一般的な追加、削除などの方法で、エンティティの共通の操作部分をIrepositoryインタフェースとして抽出します.次のコードがあります.
interface IRepository<T> where T : class

{

    IEnumerable<T> FindAll(Func<T, bool> exp);

    void Add(T entity);

    void Delete(T entity);

    void Save();

}

2.次に、上記のインタフェースを具体的に実装するための汎用クラスを実装する方法を説明する.
public class Repository<T> : IRepository<T> where T : class

{

    public DataContext context;

    public Repository(DataContext context)

    {

        this.context = context;

    }

    public IEnumerable<T> FindAll(Func<T, bool> exp)

    {

        return context.GetTable<T>().Where(exp);

    }

    public void Add(T entity)

    {

        context.GetTable<T>().InsertOnSubmit(entity);

    }

    public void Delete(T entity)

    {

        context.GetTable<T>().DeleteOnSubmit(entity);

    }

    public void Save()

    {

        context.SubmitChanges();

    }

}

3.上記の実装は、各エンティティに共通の操作ですが、実際には、各エンティティには自分のビジネスに合致する論理があります.別のインタフェースを個別に定義します.たとえば、次のようにします.
interface IBookRepository : IRepository<Book>

{

    IList<Book> GetAllByBookId(int id);

}

4.最後に、エンティティのRepositoryクラスは次のように実装されます.
public class BookRepository : Repository<Book>, IBookRepository

{

    public BookRepository(DataContext dc)

        : base(dc)

    { }

    public IList<Book> GetAllByBookId(int id)

    {

        var listbook = from c in context.GetTable<Book>()

                       where c.BookId == id

                       select c;

        return listbook.ToList();

    }

} 

上は、最も基本的な使用フレームワークを提供しています.