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

C# 存储库模式:限制、目的和好处,c#,repository-pattern,C#,Repository Pattern,我不熟悉存储库模式,我提出了以下问题: 存储库模式的目的是什么? 存储库模式的限制是什么? 存储库模式的好处是什么? 下面的方法是否应该在存储库模式中公开? 需要帮忙吗 1.存储库模式的目的是什么 提取数据源以降低复杂性。这样一来,调用者就不必了解数据源或其怪癖。他们只知道可以调用存储库并从任意数据源获取信息 2.存储库模式的限制是什么 它只用于提取数据源 软限制是人们发现很难理解如何设计存储库类。人们通常将存储库设置为泛型,这反过来会将DB实现泄漏给调用方,从而迫使调用方拥有特定于DB的kno

我不熟悉存储库模式,我提出了以下问题:

存储库模式的目的是什么? 存储库模式的限制是什么? 存储库模式的好处是什么? 下面的方法是否应该在存储库模式中公开? 需要帮忙吗

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

提取数据源以降低复杂性。这样一来,调用者就不必了解数据源或其怪癖。他们只知道可以调用存储库并从任意数据源获取信息

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

它只用于提取数据源

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

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

不太复杂的代码。调用程序get不那么复杂,因为它们只需要调用存储库中的方法来获取和存储数据源中的信息。数据访问层get的复杂度较低,因为存储库只关注检索和存储信息

4.以下方法是否应在存储库模式中公开

否。IQueryable泄漏数据库特定信息。例如,您需要知道OR/M句柄如何将LINQ转换为SQL子句中的,以及OR/M如何配置为惰性/急切加载

为了降低复杂性,存储库应该告知它支持哪种查询。使用表达式谓词就像说向我扔任何东西,我会尽力处理它。不会很好用的。再一次以IN子句为例。它的LINQ语句在不同的OR/Ms之间有所不同

使用表达式还将构造正确查询的责任转移给调用方。这意味着调用方的单元测试还必须包括验证调用方是否进行了正确查询的测试。i、 e.更复杂的测试

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

提取数据源以降低复杂性。这样一来,调用者就不必了解数据源或其怪癖。他们只知道可以调用存储库并从任意数据源获取信息

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

它只用于提取数据源

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

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

不太复杂的代码。调用程序get不那么复杂,因为它们只需要调用存储库中的方法来获取和存储数据源中的信息。数据访问层get的复杂度较低,因为存储库只关注检索和存储信息

4.以下方法是否应在存储库模式中公开

否。IQueryable泄漏数据库特定信息。例如,您需要知道OR/M句柄如何将LINQ转换为SQL子句中的,以及OR/M如何配置为惰性/急切加载

为了降低复杂性,存储库应该告知它支持哪种查询。使用表达式谓词就像说向我扔任何东西,我会尽力处理它。不会很好用的。再一次以IN子句为例。它的LINQ语句在不同的OR/Ms之间有所不同


使用表达式还将构造正确查询的责任转移给调用方。这意味着调用方的单元测试还必须包括验证调用方是否进行了正确查询的测试。i、 e.更复杂的测试。

如果存储库包含像GetCarByNumberofVechile这样的方法,那么看起来我的业务逻辑在存储库中。如果我进一步添加GetCarByNumberOfHorsePower,这也是业务逻辑。我认为更好的解决方案是在业务层编写业务逻辑,但在将查询从BLLGetCarByNumberofVechile转换为特定于存储的语言的报告编写代码中,它可以是简单的TXT,而不是业务逻辑。BL是某种计算。对特定的状态属性horsepower进行查询是一个比较属性值的简单检索
哎,真的。业务分析师告诉我:按车辆数量获取汽车,所以对我来说,这是一个业务逻辑。此外,BL是GetById,依此类推。也许,我们需要总结什么是BL?您的定义变得非常不切实际,因为您要么需要获取所有记录以便能够在BL中进行过滤,要么使用LINQ,这是应用于SQL时存在漏洞的抽象。一个中间立场是将存储库模式与规范模式相结合。我同意您的规范模式。IMO存储库应该有一个接受规范的方法,因此在BL中,我可以构建规范业务逻辑,然后传递给repositoy方法。如何将规范转换为获取数据取决于存储库。若存储库包含像GetCarByNumberofVechile这样的方法,那个么看起来我的业务逻辑在存储库中。如果我进一步添加GetCarByNumberOfHorsePower,这也是业务逻辑。我认为更好的解决方案是在业务层编写业务逻辑,但在将查询从BLLGetCarByNumberofVechile转换为特定于存储的语言的报告编写代码中,它可以是简单的TXT,而不是业务逻辑。BL是某种计算。查询特定的状态属性horsepower是一个比较属性值的简单检索。我真的不明白你的意思。业务分析师告诉我:按车辆数量获取汽车,所以对我来说,这是一个业务逻辑。此外,BL是GetById,依此类推。也许,我们需要总结什么是BL?您的定义变得非常不切实际,因为您要么需要获取所有记录以便能够在BL中进行过滤,要么使用LINQ,这是应用于SQL时存在漏洞的抽象。一个中间立场是将存储库模式与规范模式相结合。我同意您的规范模式。IMO存储库应该有一个接受规范的方法,因此在BL中,我可以构建规范业务逻辑,然后传递给repositoy方法。如何将规范转换为获取数据取决于存储库。
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);
}