我有一个CustomerRepository
从数据层检索数据的存储库 ()。大多数业务逻辑位于Customer
存储库接受或返回的实体类 ( ) 中。
但是,您将全局实体业务逻辑(适用于所有客户)放在哪里?
例如,我可能不想将所有客户返回给某些用户。我不想将该逻辑放在存储库中。
我有一个CustomerRepository
从数据层检索数据的存储库 ()。大多数业务逻辑位于Customer
存储库接受或返回的实体类 ( ) 中。
但是,您将全局实体业务逻辑(适用于所有客户)放在哪里?
例如,我可能不想将所有客户返回给某些用户。我不想将该逻辑放在存储库中。
我同意罗伯特·蒙泰努的观点。
基本上,您将模型中不固有的业务逻辑汇总到中间层。中间层是业务层/业务对象/业务逻辑层/等,但简称为服务层。它不一定是 Web 服务,它是对术语服务的广泛使用,因为它聚合了特定应用程序领域的功能。
您基本上会有一个包含存储库引用的 CustomerService 类。您的表示层将引用服务层类。
可以根据您使用的 .net 的名称猜测另外一个区别,并且可能使用 LINQ to SQL 作为您的存储库,如 NerdDinner 中所述。
Repository 通常将 IQueryable 返回给服务层,允许服务层将多个查询链接在一起以构建不同的结果集。然后,服务使用 ToList 或其他类似方法评估表达式并将其返回到表示层。
将其放入另一个存储库 (BusinessRuleRepository) 并让 CustomerRepository 使用它。
或者
如果业务逻辑只是限制用户可以看到的结果,您可能希望将 Facade 模式与工厂一起使用。在这种情况下,您将拥有一个处理您的 CustomerRepository 和 LimitedCustomerRepository(可能封装 CustomerRepository)的 ICustomerRepository,以及一个为用户返回适当的 ICustomerRepository 的 CustomerRepositoryFactory。
将其包裹在服务后面。
我认为将这些类型的功能分离到一个服务层是要走的路。
我最近建立了一个系统,使用历史数据对许多实体进行复杂的预测。将所有数据访问位放入每个实体的存储库中。我将复杂的预测逻辑保存在服务层中,并根据需要传递存储库对象。
额外的好处是,我有一种简单的方法,只需创建一个 Web api 层,就可以将所有预测逻辑暴露给外部系统。