0

私はプロジェクトの基盤としてNerdDinner(MVC 2)を使用しています。リポジトリインターフェイスの設計は非常にうまく機能しますが、私の実際のアプリケーションには数十のモデルクラスがあります(NerdDinnerにはDinnerが1つしかないのに対し)。つまり、クラスごとに1つのインターフェイス(およびその実装)が必要です。さらに、基本的なインターフェイスメソッド(get、save、add、deleteなど)は同じです。つまり、すべての実装クラスで同じコードをコピーして貼り付ける必要があります。変更されるのはクラスのタイプだけです。たとえば、顧客のインターフェースは次のことを公開します。

void Add(Customer customer)

注文のインターフェースは以下を公開します:

void Add(Order order)

実装は基本的に両方の方法で同じですが、もちろん適切なモデルタイプを使用します。

db.Customers.InsertOnSubmit(customer)

db.Orders.InsertOnSubmit(order)

それぞれ。同じコードを何度も繰り返すのをやめる(そしてプロジェクト内の.csファイルの数を最小限に抑える)ために、次のような汎用のベースリポジトリインターフェイスを定義できると思いました。

public interface IRepository<T>
{
void Add(T t)
void Delete(T t)
void Save();   // This one is truly the same in any case!
}

しかし、どうすればジェネリック型を実装コードに適用できますか?私は次のようなものが必要です:

db.T.InsertOnSubmit(t)

これはできますか?

PS:dbはdatacontextオブジェクトです(私はlinq to sqlデザイナーを使用しています)。

ありがとう

4

1 に答える 1

1

ご質問から

しかし、ジェネリック型を実装コードに適用するにはどうすればよいですか? 次のようなものが必要です:
db.T.InsertOnSubmit(t)
これはできますか?

このようなものが必要だと思います

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

アイデアを提供するための簡単なリポジトリの実装:

public class Repository<T> : IRepository<T> where T : class
{
    private NorthwindDataContext db = new NorthwindDataContext();

    public Table<T> Data
    {
        get
        {
            return db.GetTable<T>();
        }
    }

    public void Add(T entity)
    {
        db.GetTable<T>().InsertOnSubmit(entity);
    }

    public void Delete(T entity)
    {
        db.GetTable<T>().DeleteOnSubmit(entity);
    }

    public void Save()
    {
        db.SubmitChanges();
    }
}
于 2012-06-09T18:57:42.890 に答える