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

时间:2012-03-28 02:46:01

标签: c# repository-pattern

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

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

  5. 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 个答案:

答案 0 :(得分:0)

  

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

抽象出数据源以降低复杂性。通过这样做,调用者不必具有关于数据源的任何知识或它的怪癖。他们只知道他们可以调用存储库并从仲裁数据源获取信息。

  

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

它仅用于抽象数据源。

软限制是人们发现很难理解如何设计存储库类。人们常常将存储库设置为泛型,这反过来会将DB实现泄漏给调用者,从而迫使调用者具有DB特定的知识(或OR / M知识)。这些实现存在严重缺陷,与直接使用OR / Ms相比没有任何好处。

  

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

代码不太复杂。调用者变得不那么复杂,因为他们只需调用存储库中的方法来获取和存储数据源中的信息。数据访问层变得不那么复杂,因此存储库只关注重新存储和存储信息。

  

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

没有。 IQueryable<T>泄漏数据库特定信息。例如,您需要了解OR / M处理如何将LINQ转换为IN SQL子句以及如何为延迟/急切加载配置OR / M.

为了降低复杂性,存储库应该传达它支持的查询类型。使用Expression<Func<T, bool>> predicate就像是说 向我扔任何东西,我会尝试处理它 。不会很好。再次。以IN子句为例。它的LINQ语句在不同的OR / Ms之间有所不同。

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