12

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

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

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

4

4 回答 4

26

我同意罗伯特·蒙泰努的观点。

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

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

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

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

于 2009-06-18T17:17:27.993 回答
7

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

或者

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

于 2009-06-18T17:02:56.170 回答
6

将其包裹在服务后面。

于 2009-06-18T16:52:09.767 回答
0

我认为将这些类型的功能分离到一个服务层是要走的路。

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

额外的好处是,我有一种简单的方法,只需创建一个 Web api 层,就可以将所有预测逻辑暴露给外部系统。

于 2014-03-02T18:08:41.153 回答