存储库模式:限制、目的和好处

本文关键字:模式 限制 存储 | 更新日期: 2023-09-27 18:29:08

我是存储库模式的新手,我提出了以下问题:

  1. 存储库模式的目的是什么
  2. 存储库模式的限制是什么
  3. 存储库模式的好处是什么
  4. 下面的方法应该在存储库模式中公开吗

public IQueryable<T> GetQuery(){
    return _objectSet;
}
public IEnumerable<T> GetAll(){
    return GetQuery().AsEnumerable();
}
public IEnumerable<T> Find(Expression<Func<T, bool>> predicate){
    return _objectSet.Where(predicate);
}
public T Single(Expression<Func<T, bool>> predicate){
    return _objectSet.Single(predicate); 
}
public T First(Expression<Func<T, bool>> predicate){
    return _objectSet.First(predicate);
}

请帮忙吗?

存储库模式:限制、目的和好处

1.存储库模式的目的是什么?

抽象掉数据源以降低复杂性。通过这样做,调用者不必对数据源或其怪癖有任何了解。他们只知道可以调用存储库并从任意数据源获取信息。

2.存储库模式的局限性是什么?

它只用于抽象数据源。

软限制是人们很难理解如何设计存储库类。通常,人们会将存储库设置为通用存储库,从而将DB实现泄露给调用程序,从而迫使调用程序拥有特定于DB的知识(或or/M知识)。这些实现存在严重缺陷,与直接使用OR/M相比没有任何好处。

3.存储库模式的好处是什么?

不太复杂的代码。调用者get不那么复杂,因为他们只需要调用存储库中的一个方法就可以在数据源中获取和存储信息。数据访问层不那么复杂,因为存储库只专注于检索和存储信息。

4.下面的方法应该在存储库模式中公开吗?

没有。IQueryable<T>泄露DB特定信息。例如,您需要知道OR/M处理程序如何将LINQ转换为INSQL子句,以及OR/M是如何配置为懒惰/急切加载的。

为了降低复杂性,存储库应该传达它支持的查询类型。使用Expression<Func<T, bool>> predicate就像说向我扔任何东西,我会尽力处理它。不会很好用。再一次以IN子句为例。它的LINQ语句因不同的OR/M而异。

使用表达式还将构造正确查询的责任转移到调用者身上。这意味着调用者的单元测试还必须包括用于验证调用者是否进行了正确查询的测试。即更复杂的测试。