This link描述了 Money 对象上的一个函数,用于将不同货币的资金加在一起。
首先我不想使用服务定位器模式。我目前使用的模式是不让 Money 对象自行进行转换。如果您尝试将不同的货币加在一起,它就会抛出。
我有一个拥有 Money 对象的对象(即 MultiCurrencyAccount)处理 Money 的数学运算。我的问题是我目前正在构造函数中将 IMoneyConverter 注入(inject) MultiCurrencyAccount 域对象。这对我来说感觉很脏,因为 IMoneyConverter 实际上是一种服务,它又使用 IForeignExchangeService(这个服务可以访问数据库)。我知道我不应该关心实现,因为我正在处理抽象,但感觉很奇怪。
我不确定我是否错了,将服务注入(inject)我的域对象是否“正确”,或者是否有更优雅的方法来做到这一点。
最佳答案
如果您将 Money 视为值对象(这很有意义),则很有可能为它们设计内置转换功能。
但是,由于您引用了有关领域驱动设计的链接,您应该问问自己,这是否真的是为货币建模的正确方法?
在大多数情况下,一捆美元不会神奇地把自己变成等值的欧元。您必须将它们带到某个兑换站才能将您的美元兑换成欧元。一旦你这样做了,现在你有欧元,没有美元。如果之后汇率发生变化,也不会影响您现在拥有的欧元数额。
我并不是说它会一直这样。最后,这取决于您的业务领域,但我认为如果您询问您的业务专家,您很可能会发现货币交易的业务规则与货币本身脱钩 .如果是这种情况,将货币兑换建模为与值(value)对象分开的服务更有意义。
关于dependency-injection - 如何在没有服务位置的情况下根据域对象中的汇率转换货币,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9138503/