如何在DDD中处理货币转换?

时间:2018-01-07 17:45:15

标签: domain-driven-design ddd-repositories aggregateroot value-objects clean-architecture

短版本: 对于需要访问数据库中的货币转换率的价值对象,您认为什么是最佳选择? 例如:

Invoice.Amount = Invoice.Amount.toCurrency('CAD')

长版: 我有一个名为InvoiceAmount的值对象,它有一个方法toCurrency,它将发票金额转换为指定的货币。我想重复使用这种货币转换逻辑,因为我知道我会在其他有界的上下文中使用它(例如SalesOrderAmountFreightCost等)。我的第一个想法是在SharedKernel中创建一个Money对象,然后让SalesOrderAmountFreightCostInvoiceAmount继承自MoneytoCurrency将在Money类中实现,因此它只在一个地方。这对我来说听起来不错,但也许有更好的方法。现在我遇到的问题是,在我的系统中,货币转换率存储在数据库中,因此我需要一个存储库来访问转换率,以便Money实现toCurrency。我非常确定DDD不会在实体或价值对象中调用存储库,因此我很难弄清楚如何实现这一目标。我正在考虑使用域名服务来实际进行货币转换,而Money只会调用域名服务,但是,我不确定DDD是否认为这是一个不错的选择。也许我需要将域服务注入每个聚合根(SalesOrderInvoiceShipment),这样我就可以将其注入每个Money值对象,以便它可以依次进行货币转换。你怎么看?提前谢谢。

1 个答案:

答案 0 :(得分:4)

  

我非常确定DDD说不要在实体或值对象中调用存储库

坚持下去,这是一个很好的规则。它将使您的模型保持清洁和纯净。

  

我在考虑使用域名服务来实际进行货币转换

我认为这是要走的路。但是,您应该尝试根据现实世界设计模型。谁在金融世界负责转换资金?银行或交换点(我不知道他们在您所在的国家/地区的具体信息)。

所以,我的建议是定义一个在基础结构中实现的域接口(即MoneyExchangeService),该接口只有一个方法:convertAmount。您可以在Application层中调用它,并将结果作为参数传递给Account aggregate方法。这将使责任保持在他们所属的位置。