简短版本: 对于需要访问数据库中的货币兑换率的值对象,您认为最佳选择是什么? 例如:
Invoice.Amount = Invoice.Amount.toCurrency('CAD')
长版:
我有一个名为 InvoiceAmount
的值对象,它有一个方法 toCurrency
,可以将发票金额转换为指定的货币。我想重用这个货币转换逻辑,因为我知道我将在其他有界上下文中需要它(例如 SalesOrderAmount
、FreightCost
等)。我的第一个想法是在 SharedKernel 中创建一个 Money
对象,然后让 SalesOrderAmount
、FreightCost
和 InvoiceAmount
继承自钱
。 toCurrency
将在 Money
类中实现,因此它只在一个地方。这对我来说听起来不错,但也许有更好的方法。现在我遇到的问题是,在我的系统中,货币兑换率存储在数据库中,因此我需要一个存储库来访问兑换率,以便 Money
实现 toCurrency
。我很确定 DDD 说不要在实体或值对象中调用存储库,所以我正在努力弄清楚如何实现这一点。我正在考虑使用域服务来实际进行货币转换,Money
只会调用域服务,但是,我不确定 DDD 是否认为这是一个好的选择。也许我需要将域服务注入(inject)每个聚合根(SalesOrder
、Invoice
和 Shipment
),这样我就可以将它注入(inject)每个 Money 值对象所以它可以反过来进行货币转换。你怎么看?提前谢谢你。
最佳答案
I'm pretty sure DDD says not to call Repositories in Entities or Value Objects
坚持下去,这是一个很好的规则。它将使您的模型保持整洁和纯净。
I was thinking of using a Domain Service to actually do the currency conversion
我认为这是要走的路。但是,您应该尝试根据现实世界设计您的模型。谁在金融界负责货币兑换?银行或兑换点(我不知道它们在您所在国家/地区的具体名称)。
因此,我的建议是定义一个在基础设施中实现的域接口(interface)(即 MoneyExchangeService
),它只有一个方法:convertAmount
。您在应用层调用它并将结果作为参数传递给您的 Account aggregate
方法。这将使责任保持在他们所属的地方。
关于domain-driven-design - 如何在 DDD 中处理货币转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48139897/