没有接口的存储库模式

And*_*kov 0 .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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我们想扩展存储库,我们使用ProductRepository:Repository和overrider\extend方法.

我知道接口让我们:

  • 使用TDD方法
  • 替换持久性引擎

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

谢谢,安德鲁

Jam*_*mes 6

没有接口实现存储库模式没有什么不好,无论您是否觉得需要使用接口,都取决于您.

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

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