3

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

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

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

4

1 回答 1

4

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

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

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

我认为这是要走的路。但是,您应该尝试根据现实世界设计模型。谁在金融界负责货币兑换?银行或兑换点(我不知道它们在您所在国家/地区的确切名称)。

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

于 2018-01-07T18:58:02.210 回答