Repository 存储库模式和业务逻辑

Repository 存储库模式和业务逻辑,repository,repository-pattern,Repository,Repository Pattern,我有一个从数据层检索数据的存储库(CustomerRepository)。大多数业务逻辑位于存储库接受或返回的实体类(Customer)中 但是,您将全局实体业务逻辑(适用于所有客户)放在哪里 例如,我可能不想将所有客户返回给某些用户。我不想将该逻辑放在存储库中。将其包装在服务后面。将其放在另一个存储库(BusinessRuleRepository)中,并让CustomerRepository使用它 或 如果业务逻辑只是限制用户可以看到的结果,那么您可能希望将Facade模式用于工厂。在这种情况

我有一个从数据层检索数据的存储库(
CustomerRepository
)。大多数业务逻辑位于存储库接受或返回的实体类(
Customer
)中

但是,您将全局实体业务逻辑(适用于所有客户)放在哪里


例如,我可能不想将所有客户返回给某些用户。我不想将该逻辑放在存储库中。

将其包装在服务后面。

将其放在另一个存储库(BusinessRuleRepository)中,并让CustomerRepository使用它


如果业务逻辑只是限制用户可以看到的结果,那么您可能希望将Facade模式用于工厂。在这种情况下,您将拥有一个处理CustomerRepository和LimitedCustomerRepository(可能封装CustomerRepository)的ICCustomerRepository,以及一个为用户返回适当ICCustomerRepository的CustomerRepository工厂。

我同意Robert Munteanu的观点

基本上,您可以将模型中不固有的业务逻辑汇总到中间层。中间层是业务层/业务对象/业务逻辑层/etc,但仅称为服务层。它不一定是一个Web服务,它广泛使用服务这个术语,因为它聚合了特定应用程序领域的功能

基本上,您将拥有一个包含存储库引用的CustomerService类。您的表示层将引用服务层类

还有一个额外的区别,可以从您使用的.net的名称中猜出,可能使用LINQ to SQL作为您的存储库,如NerdDinner中所述


存储库通常会将IQueryable返回给服务层,从而允许服务层将多个查询链接在一起以构建不同的结果集。然后,服务使用ToList或其他类似的方法计算表达式,并将其返回到表示层。

我认为将这些类型的函数分离到服务层是一种可行的方法

我最近建立了一个系统,使用历史数据对许多实体进行复杂的预测。将每个实体的所有数据访问位放入存储库。我将复杂的预测逻辑保存在服务层中,并根据需要传入存储库对象


额外的好处是,通过创建web api层,我可以轻松地将所有预测逻辑公开给外部系统。

在这种情况下这意味着什么?我有点认为服务是域模型中其他一切的场所。同意。使用某种方法创建CustomerService,在其中更新所有客户。至少试着给出你的观点的理由如何?Rob Connery的MVC店面让我对存储库模式产生了兴趣,但不幸的是,他重构了服务层,但没有在视频中真正解释这一决定。所以我担心这可能不是最好的方式。我面临着一个类似的问题,这是最好的架构吗?我不再担心与工厂顶层合同的接口,而是专注于使其工作。我发现很多时候,人们对解决方案的架构过于关注。构建代码库这一时刻的目的是为了向其自身的强大性和层次的完美性致敬吗?我认为,只要您将数据内容保存在存储库中,将“业务逻辑”保存在业务服务中,将UI内容保存在视图中,就可以继续使用。完成软件应该做的事情,根据您的目标进行重构并完成软件的目标。从存储库返回
IQueryable
会破坏存储库提供给您的数据访问抽象。
IQueryable
是一个可以查询数据的对象,它不提供数据。因此,为服务类编写单元测试非常困难,因为您现在必须处理服务中的底层数据库(并非所有Linq提供程序都实现所有扩展方法)。当您的存储库返回物化数据时,您可以在单元测试中对其进行模拟,而不必关心您的备份存储是否是SQL数据库、oracle、文件系统等@AlexanderDerck,但当不同的服务层方法需要包含不同的数据时,您会怎么做?是否有ARepository.GetIncludeB()和ARepository.GetIncludeC()方法?那么.然后include()呢。。。