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

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

例如,我可能不希望将所有客户都退回给某些用户。我不想把这个逻辑放在存储库中。

有帮助吗?

解决方案

我同意Robert Munteanu。

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

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

还有一个额外的区别,可以根据您使用.net的名称猜测,并且可能使用LINQ to SQL作为NerdDinner中概述的存储库。

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

其他提示

将其包裹在服务之后。

将其放入另一个存储库(BusinessRuleRepository)并让CustomerRepository使用它。

如果业务逻辑仅限制结果,则用户可以看到您可能希望将Facade模式与工厂一起使用。在这种情况下,您将拥有一个ICustomerRepository来处理您的CustomerRepository和LimitedCustomerRepository(可能封装CustomerRepository),以及一个CustomerRepositoryFactory,它为用户返回相应的ICustomerRepository。

我认为将这些类型的功能分离到服务层是可行的方法。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top