しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Repository パターンまとめ

まとめになるかはわかりません。タイトルを思いつかなかっただけです。

Repository for ASP.NET MVC - しばやん雑記 で Repository の使い方をちょろーんと書きましたが、IRepository で共通部分くくりだしているのに、実装はそれぞれの Repository 任せってダメダメでしたね。

なので、今回は共通部分は実装してしまおうという方向。

// 共通の Repository インターフェース
public interface IRepository<T>
{
    void Add(T entity);
    void Remove(T entity);
    IList<T> ListAll();
}

// Bookmark 専用のインターフェース
public interface IBookmarkRepository : IRepository<Bookmark>
{
    Bookmark Find(string url);
}

// 共通部分は先に実装しておく
public class Repository<T> : IRepository<T>
{
    // 実装は省略
    public void Add(T entity) { ... }
    public void Remove(T entity) { ... }
    public IList<T> ListAll() { ... }
}

// 実際に DB から引っ張ってくる Repository
public class BookmarkRepository : Repository<Bookmark>, IBookmarkRepository
{
    public Bookmark Find(string url)
    {
        // 実装は省略
    }
}

そして、ジェネリックを使っているので、エンティティクラスごとに Repository を作る必要が無くなったわけです。特殊なメソッドが必要な場合は IRepository を継承したインターフェースを用意してやって、それを Repository で実装します。

実際に LINQ to SQL や Entity Framework を使うときに、DataContext などをどうしようという問題が出てきます。Repository のメンバとして持たせてもいいかもしれないですが、2 つ以上の Repository を同時に使う時に嫌な感じです。これは Factory を用意して出来るだけ使いまわしするべきかな?

今は LINQ to SQL だけど、将来的には Entity Framework に切り替えたい!という時には、さらに抽象化しないとダメな予感。*1

*1:LINQ to SQL -> Entity Framework ぐらいなら直接書き換えるほうが手間がかからない気もする……