2009-12-05 40 views
31

我已经看到了两种不同的创建通用资源库的方法。这两种方法(利弊)有什么区别? 请diregard差异的方法,因为我感兴趣的通用资源库 - IRepository <T>或IRepository

public interface IRepository<T> where T : class 

public interface IRepository : IDisposable 

之间也是有差别的在功能性,灵活性,单元测试有什么区别...?我会得到或失去什么?
它们在依赖注入框架中注册的方式有什么不同吗?

选项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<T>被绑定到单个类型而一个IRepository潜在地绑定到多个类型。哪一个适合高度依赖于你的特定场景。

一般来说我觉得IRepository<T>更有用。在使用时,它非常清楚IRepository<T>的内容是什么(T)。另一方面,从给定的IRepository中不能清楚地知道它里面包含了什么。

在需要存储多种类型对象的情况下,我通常会创建IRepository<T>实例的映射。例如:Dictionary<T,IRepository<T>>

+5

当我的实体有非常不同的方法时,我不建议为每个实体实施IRepository ,因为每个实体都会有一个空的实现,它可能根本不会使用。 只有当你的实体有很多常用的方法时,你的Repository类才会最终包含空方法才能执行IRepository 。 – msfanboy 2010-05-18 08:56:31

+2

我不认为一个空洞的方法就像一个巨大的,世界末日的太阳天才一样危险。 – ProfK 2013-03-10 10:31:04