关于.net:没有接口的存储库模式

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,而且没有足够的时间来写测试。那么,使用经典的存储库模式(使用IRepository, IProductRepository模式)还有什么好处呢?

谢谢,安德鲁


实现没有接口的存储库模式没有什么不好的,您是否需要使用接口取决于您自己。

正如您所说,使用接口的好理由是保持持久性层与业务逻辑层的抽象,当然为了更容易测试。但是,如果您可以保证不会更改后端(或者至少在不久的将来不会放弃它的更改),并且您不打算编写测试(大错误),那么您可能不需要使用接口。

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


嘲笑!由于某种原因,数据库可能无法访问,通过使用接口,您可以很容易地在真实数据和虚拟数据之间切换。