【问题标题】:How do I convert Money based on FX rates in a domain object without Service Location如何在没有服务位置的域对象中根据外汇汇率转换货币
【发布时间】:2012-02-26 15:39:33
【问题描述】:

This link 描述了 Money 对象上的一个函数,用于将不同货币的资金相加。

首先我不想使用服务定位器模式。我目前使用的模式是不让 Money 对象自己进行转换。如果您尝试将不同的货币添加在一起,它就会抛出。

我让拥有 Money 对象的对象(即 MultiCurrencyAccount)处理 Money 上的数学运算。我的问题是我目前正在将 IMoneyConverter 注入 MultiCurrencyAccount 域对象的构造函数。这对我来说感觉很脏,因为 IMoneyConverter 实际上是一种服务,它反过来使用 IForeignExchangeService (这个可以访问数据库)。我知道我不应该关心实现,因为我正在处理一个抽象,但感觉很奇怪。

我不确定我是否偏离基础并将服务注入我的域对象是“正确的”,或者是否有更优雅的方法来做到这一点。

【问题讨论】:

  • 直截了当:您想要添加不同货币的货币(例如美元和欧元)。您有一项服务(MultiCurrencyAccount),它使用IMoneyConverter 将不同的货币转换为目标货币。 IMoneyConverter 的实现使用IForeignExchangeService 来查找兑换的汇率。听起来很合理,尽管当您的 IForeignExchangeService 已经进行转换时,我不确定您是否真的需要转换器。
  • 塞巴斯蒂安,你说得很对。 IForeignExchangeService 的原因是它只是提供费率,而 IMoneyConverter 实际上包含转换数学。

标签: dependency-injection domain-object


【解决方案1】:

如果您将 Money 视为价值对象(这很有意义),则很有可能使用内置的转换功能来设计它们。

但是,由于您引用了有关领域驱动设计的链接,您应该问自己这是否真的是建模 Money 的正确方法?

在大多数情况下,一捆美元不仅会神奇地变成等值的欧元。您必须将它们带到某个兑换站才能将您的美元兑换成欧元。一旦你这样做了,现在你有欧元,没有美元。如果之后汇率发生变化,不会影响您现在拥有的欧元数量。

我并不是说它总是会这样。最后,这取决于您的业务领域,但我认为如果您询问您的业务专家,您很可能会发现货币交易的业务规则与货币本身是脱钩的 .如果是这种情况,将货币兑换建模为独立于价值对象的服务会更有意义。

【讨论】:

  • 谢谢马克。我已经将我们的 Money 对象设计为一个不可变的值对象,我真的很喜欢这种模式。如果将 IMoneyConverter 注入域对象有异味,您有意见吗?真正让我想到的是,我的 Repository 必须将一个 IMoneyConverter 注入到域对象中,然后再将其传递给服务层以供使用。
  • 我觉得有点臭,但不明确:stackoverflow.com/questions/4835046/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-30
相关资源
最近更新 更多