没有接口的存储库模式

时间:2011-12-18 14:41:34

标签: .net nhibernate design-patterns repository

没有接口实现存储库模式有什么不好?

存储库 - 类

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:Repository和overrider \ extend方法。

我知道接口让我们:

  • 使用TDD方法
  • 替换persistance引擎

但如果我不想替换我的nhibernate并且没有足够的时间来编写测试。那么使用经典存储库模式(使用IRepository<T>, IProductRepository

的其他优点是什么?

谢谢,安德鲁

2 个答案:

答案 0 :(得分:6)

没有关于在没有接口的情况下实现存储库模式的错误,无论您是否觉得需要使用接口,都由您决定。

就像你已经说明使用接口的充分理由一样,要保持你的持久层从业务逻辑层中抽象出来,当然也是为了更容易测试。但是,如果您可以保证,您将不会改变您的后端(或者至少您不能预见它在不久的将来会发生变化)并且您不打算编写测试(大错误)然后可能没有必要使用接口。

我看到的红旗是“没有足够的时间来编写测试”。现在可能就是这种情况,但是,当你将来有什么时候呢?同样,这是你的决定,但是,如果我是你,我会使用接口(即使你根本没有编写测试),因为它不会对你的代码造成任何伤害,也不会花费那么多时间来做如果您决定切换后端或编写测试,将来会为您节省很多麻烦。

答案 1 :(得分:0)

嘲讽!
由于某些原因,您的数据库可能无法访问,通过使用界面,您可以非常轻松地在实际数据和虚拟数据之间切换。