Repository pattern without interfaces
实现没有接口的存储库模式有什么坏处?
存储库-类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | public class WebRepository<T> { private readonly Type persitentType = typeof(T); public virtual T GetById(int id) { return NHibernateSession.Get<T>(id); } public virtual List<T> GetAll() { return GetByCriteria(); } public List<T> GetByCriteria(params ICriterion[] criterion) { ICriteria criteria = NHibernateSession.CreateCriteria(persitentType); foreach (ICriterion criterium in criterion) criteria.Add(criterium); return criteria.List<T>() as List<T>; } public T Save(T entity) { NHibernateSession.Save(entity); return entity; } public T SaveOrUpdate(T entity) { NHibernateSession.Update(entity); return entity; } public void Delete(T entity) { NHibernateSession.Delete(entity); } private ISession NHibernateSession { get { return SessionManager.CurrentSession; } } } |
如果我们想扩展我们使用的存储库ProductRepository:存储库和重写器扩展方法。
我知道界面让我们:
- 使用TDD方法
- 更换持久性发动机
但如果我不想换掉我的NHibernate,而且没有足够的时间来写测试。那么,使用经典的存储库模式(使用
谢谢,安德鲁
实现没有接口的存储库模式没有什么不好的,您是否需要使用接口取决于您自己。
正如您所说,使用接口的好理由是保持持久性层与业务逻辑层的抽象,当然为了更容易测试。但是,如果您可以保证不会更改后端(或者至少在不久的将来不会放弃它的更改),并且您不打算编写测试(大错误),那么您可能不需要使用接口。
不过,我看到的红旗是"没有足够的时间编写测试"。现在可能是这样,但是,将来当你有时间的时候呢?同样,这是您的决定,但是,如果我是您,我将使用接口(即使您根本没有编写测试),因为它不会对您的代码造成任何伤害,也不会占用太多时间来这样做,如果您曾经决定切换后端或编写测试,那么将来会为您节省很多麻烦。
嘲笑!由于某种原因,数据库可能无法访问,通过使用接口,您可以很容易地在真实数据和虚拟数据之间切换。