简短版本:对于需要在数据库中访问货币兑换率的值对象,您认为最佳选择是什么? 前任:
Invoice.Amount = Invoice.Amount.toCurrency('CAD')
长版本:我有一个名为InvoiceAmount
的值对象,它有一个方法,toCurrency
,将发票金额转换为指定的货币。 我想重用这个货币转换逻辑,因为我知道我将在其他有界上下文中需要它(例如SalesOrderAmount
、FreightCost
等)。 我的第一个想法是在 SharedKernel 中创建一个Money
对象,然后从Money
继承SalesOrderAmount
、FreightCost
和InvoiceAmount
。toCurrency
将在Money
类中实现,因此它只在一个地方。 这对我来说听起来不错,但也许有更好的方法。 现在我遇到的问题是在我的系统中,货币兑换率存储在数据库中,所以我需要一个存储库来访问兑换率,以便Money
实现toCurrency
。 我很确定 DDD 说不要调用实体或值对象中的存储库,所以我正在努力弄清楚如何实现这一目标。 我正在考虑使用域服务来实际进行货币转换,Money
只会调用域服务,但是,我不确定 DDD 是否认为这是一个不错的选择。 也许我需要将域服务注入到每个聚合根(SalesOrder
、Invoice
和Shipment
),以便我可以将其注入到每个货币值对象中,以便它可以反过来进行货币转换。 你觉得怎么样? 提前谢谢你。
确定 DDD 说不要调用实体或值对象中的存储库
继续保持这一点,这是一个很好的规则。它将使您的模型保持干净和纯净。
我正在考虑使用域服务来实际进行货币转换
我认为这是要走的路。但是,您应该尝试根据现实世界设计模型。谁在金融界负责货币兑换?银行或兑换点(我不知道它们在您所在的国家/地区究竟如何称呼)。
因此,我的建议是在基础架构中定义一个域接口(即MoneyExchangeService
),它只有一个方法:convertAmount
。您可以在应用程序层中调用它,并将结果作为参数传递给Account aggregate
方法。这将使责任保持在他们所属的地方。