Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 没有接口的存储库模式_.net_Nhibernate_Design Patterns_Repository - Fatal编程技术网

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

.net 没有接口的存储库模式,.net,nhibernate,design-patterns,repository,.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>

在没有接口的情况下实现存储库模式有什么坏处

存储库类

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;
        }
    }
}
公共类WebRepository
{
私有只读类型persitentType=typeof(T);
公共虚拟T GetById(int id)
{
返回NHibernateSession.Get(id);
}
公共虚拟列表GetAll()
{
返回GetByCriteria();
}
公共列表GetByCriteria(参数ICriterion[]标准)
{
ICriteria-criteria=NHibernateSession.CreateCriteria(persitentType);
foreach(标准中的ICriterion标准)
标准。添加(标准);
将criteria.List()作为列表返回;
}
公共T保存(T实体)
{
NHibernateSession.Save(实体);
返回实体;
}
公共T存储或更新(T实体)
{
NHibernateSession.Update(实体);
返回实体;
}
公共作废删除(T实体)
{
删除(实体);
}
私人网络会话
{
收到
{
返回SessionManager.CurrentSession;
}
}
}
如果我们想扩展我们使用的存储库 ProductRepository:存储库和重写器\扩展方法

我知道界面让我们:

  • 使用TDD方法
  • 更换持久性引擎
但是如果我不想替换我的nhibernate,并且没有足够的时间编写测试。那么,使用经典存储库模式(使用
IRepository、IProductRepository
)还有什么其他优势呢

谢谢,Andrew

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

正如您所说的,使用接口的好理由是保持持久性层从业务逻辑层抽象出来,当然也是为了更易于测试。但是,如果您可以guarentee您不会更改后端(或者至少您不能预见它在不久的将来会发生更改),并且您不打算编写测试(大错误),那么您可能没有必要使用接口

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

Mocking

由于某些原因,您的数据库可能无法访问,通过使用该接口,您可以非常轻松地在真实数据和虚拟数据之间切换。

您没有足够的时间编写测试吗?我希望你有很多时间进行调试!依赖注入是使用接口的另一个很好的理由+一个好答案