2009-12-05 5 views
31

一般的なリポジトリを作成するための2つの異なる方法があります。これら2つのアプローチ(賛否両論)の違いは何ですか?私は一般リポジトリ - IRepository <T>またはIRepository

public interface IRepository<T> where T : class 

public interface IRepository : IDisposable 

の違いに興味を持っていますので 機能性、柔軟性、ユニットテストのいずれかの違いがある方法の違いをdiregardください...?私は何を得るか、失うでしょうか?
Dependency Injectionフレームワークでどのように登録されているかに違いはありますか?

オプション1

public interface IRepository<T> where T : class 
{ 
     T Get(object id); 
     void Attach(T entity); 
     IQueryable<T> GetAll(); 
     void Insert(T entity); 
     void Delete(T entity); 
     void SubmitChanges(); 
} 

オプション2

public interface IRepository : IDisposable 
    { 
     IQueryable<T> GetAll<T>(); 
     void Delete<T>(T entity); 
     void Add<T>(T entity); 
     void SaveChanges(); 
     bool IsDisposed(); 
    } 

答えて

27

最大の違いはIRepositoryが潜在的に複数のタイプにバインドされている間IRepository<T>が単一のタイプにバインドされていることです。どれが適切かは、特定のシナリオに大きく依存します。

一般的に言えば、IRepository<T>がより有用であるとわかります。使用時には、IRepository<T>の内容が(T)であることは非常に明確です。一方で、その内部に何が入っているかは、特定のIRepositoryから明らかではありません。

複数の種類のオブジェクトを格納する必要がある場合は、通常、IRepository<T>のインスタンスのマップを作成します。例えば、Dictionary<T,IRepository<T>>

+5

私のエンティティが非常に異なるメソッドを持っている場合、すべてのエンティティは、まったく使用しないかもしれないメソッドの空の実装を持つため、IRepository を実装することはお勧めしません。 IRepository あなたのエンティティに多くの一般的なメソッドがある場合のみ、リポジトリクラスに空のメソッドが含まれるようになります。 – msfanboy

+2

私は空の方法が巨大な世界的な太陽の才能と同じくらい危険だとは思わない。 – ProfK

関連する問題