0

我有一个业务规则要在域层中验证 Order 实体。该规则是请求客户必须在商店拥有至少 30 天的帐户才能获得特定折扣。30 的值可以定义为域层的订单实体中的常量,或者作为存储过程的一部分,其中它被定义为常量并在被应用程序服务调用时返回,然后传递给域实体进行规则验证?

如果是在存储过程中,那么我可以更改数据库中的数字并重新编译存储过程,这很容易做到,不需要其他人参与。但是如果我把它放在实体中,它就会成为应用程序代码的一部分,不仅需要重新编译,还需要重新分发。

对于试图实现 DDD 设计的 N 层设计应用程序,这些数字常量存储在哪里?

4

1 回答 1

1

简短的回答:它属于域:)

好吧,在您的域中定义的接口与定义存储库的方式相同。实现可以在任何地方,甚至包括域中包含的一些默认实现。

在您的示例中,您的折扣条件相当简单。但是,如果您的折扣百分比确定更复杂,该怎么办?人们不希望在存储过程中这样做,因为测试会更加困难。让我们假设确实将它放在存储过程中。当您有多个客户使用您的程序时会发生什么,每个客户都需要不同的天数。

关键是您需要与您的领域专家一起确定如何配置和设计规则以使其尽可能灵活。例如,如果您只需要更改日期,那么您可以将其作为系统中的一些可配置设置。

但是,您可能想要遵循策略模式的东西。想想看,大多数系统都是策略模式:)

无论如何,以下内容(或在您的场景中有意义的任何内容)怎么样:

public interface IDiscountService
{
    float GetDiscount(Customer customer, Order order);
}

在实现中,您可以有一个IDiscountConfiguration提供天数的注入,无论它们可能需要从哪里(app.config、web-service、xml、数据库)检索。

使用此机制,您可以随时更改折扣的确定方式,而无需依赖特定的实现。您可以尽可能让每个客户端的实现有所不同,并为您所在的环境简单地实例化相关的折扣计算器。

new此外,当您在单元测试中创建一个实例并进行测试时,测试各种服务变得轻而易举。

于 2016-03-11T05:24:18.913 回答