domain-driven-design - 如何在 DDD 中处理货币转换?

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

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

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

长版: 我有一个名为 InvoiceAmount 的值对象,它有一个方法 toCurrency,可以将发票金额转换为指定的货币。我想重用这个货币转换逻辑,因为我知道我将在其他有界上下文中需要它(例如 SalesOrderAmountFreightCost 等)。我的第一个想法是在 SharedKernel 中创建一个 Money 对象,然后让 SalesOrderAmountFreightCostInvoiceAmount 继承自toCurrency 将在 Money 类中实现,因此它只在一个地方。这对我来说听起来不错,但也许有更好的方法。现在我遇到的问题是,在我的系统中,货币兑换率存储在数据库中,因此我需要一个存储库来访问兑换率,以便 Money 实现 toCurrency。我很确定 DDD 说不要在实体或值对象中调用存储库,所以我正在努力弄清楚如何实现这一点。我正在考虑使用域服务来实际进行货币转换,Money 只会调用域服务,但是,我不确定 DDD 是否认为这是一个好的选择。也许我需要将域服务注入(inject)每个聚合根(SalesOrderInvoiceShipment),这样我就可以将它注入(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/

相关文章:

domain-driven-design - 将子实体添加到聚合根的推荐方法是什么?

exception-handling - 反腐败层(ACL)中的异常处理

.net - 使用Entity Framework和DDD时如何实例化新对象?

fluent-nhibernate - Fluent Nhibernate 域驱动设计

rest - 如何从 ddd 中的另一个限界上下文检索数据?

domain-driven-design - DDD 如何获取值对象列表

java - Spring Data 存储库实际上是如何实现的?

c# - 在 DDD 中打包存储库及其接口(interface)

scala - DDD功能方式: Why is it better to decouple state from the behavior when applying DDD with functional language?

domain-driven-design - 聚合是否必须高度一致?