简短的回答:它属于域:)
好吧,在您的域中定义的接口与定义存储库的方式相同。实现可以在任何地方,甚至包括域中包含的一些默认实现。
在您的示例中,您的折扣条件相当简单。但是,如果您的折扣百分比确定更复杂,该怎么办?人们不希望在存储过程中这样做,因为测试会更加困难。让我们假设确实将它放在存储过程中。当您有多个客户使用您的程序时会发生什么,每个客户都需要不同的天数。
关键是您需要与您的领域专家一起确定如何配置和设计规则以使其尽可能灵活。例如,如果您只需要更改日期,那么您可以将其作为系统中的一些可配置设置。
但是,您可能想要遵循策略模式的东西。想想看,大多数系统都是策略模式:)
无论如何,以下内容(或在您的场景中有意义的任何内容)怎么样:
public interface IDiscountService
{
float GetDiscount(Customer customer, Order order);
}
在实现中,您可以有一个IDiscountConfiguration
提供天数的注入,无论它们可能需要从哪里(app.config、web-service、xml、数据库)检索。
使用此机制,您可以随时更改折扣的确定方式,而无需依赖特定的实现。您可以尽可能让每个客户端的实现有所不同,并为您所在的环境简单地实例化相关的折扣计算器。
new
此外,当您在单元测试中创建一个实例并进行测试时,测试各种服务变得轻而易举。