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