DDD如何在没有存储库的情况下处理值对象

DDD how to handle value objects without repository

我需要一些关于值对象的帮助。考虑以下示例。

我有实体卡,其中包含通用货币(美元、欧元、英镑)和卡类型(Visa、Visa Electron、Mastercard)。我认为货币和卡类型是值对象,它们存储在源代码中。根据 DDD 值对象没有存储库。

  1. 问题是如何填写货币和卡片的下拉列表 创建新 Card 实体时在界面中键入。
  2. 将 类 放在应用程序、域或基础架构层中的什么位置 以及如何从中检索数据。

一个简单的例子将是无价的

更新1

那是我的第一个方法,但是.. 我在 MoneyTransfer 等其他实体中使用货币,在那里我使用 EUR USD GBP 和其他一些货币,所以我必须再创建一个枚举

public enum MoneyTransferCurrency{
    USD, EUR, GBP and a few other
}

这样我复制了一些货币,如果我们停止处理美元付款,我必须找到所有枚举并删除美元货币。

你误解了 VO,阅读更多关于它们的信息,我认为理解它们的简单方法是查找 Person / Addres 示例。

你的情况呢,建3个表就好了,不要把简单的事情想复杂了:

Card (CardID, CurrencyID, CardTypeID)  
Currency (CurrencyID, CurrencyName)  
CardType (CardTypeID, CardTypeName)

对于 DropDown,您只需查询 Currency 和 CardType 表。将来如果您要添加新的货币或卡类型,这将很容易做到。

不要试图把简单的事情复杂化。

如果你先验知道这些 VO 的所有可能值,你可以将它们设为 enum

public enum Currency{
    USD, EUR, GBP
}

然后来自代码:

Currency.values()

问问自己,这些值多久改变一次? (系统使用一种新货币的频率是多少?)
开发和维护系统(如 db tables)以动态添加和删除这些值而不重新启动应用程序的成本是否低于使用枚举并在发生更改时重新编译项目的成本?

很多次我因为这个解决方案而受到批评,比如 "I need a description of the value",比如在一个视图中写 "Euro" 当你有 EUR 价值时,如果你有 table你可以有一个描述栏。
这可以使用如下属性文件轻松解决:

labels.currency.EUR=Euro
labels.currency.USD=Dollars

还要检查这个:
- Loading a Value object in List or DropdownList, DDD
- Simple aggregate root and repository question

CurrencyCardType 不一定是合理的值对象。值对象对包含相关属性的概念整体进行建模。可以通过比较值对象的所有属性来比较值对象。

例如,考虑一个由数值和货币组成的 MonetaryValue 值对象:

public class MonetaryValue {

    private BigDecimal value;
    private Currency currency;

    public Amount(BigDecimal value, Currency currency) {
        // validations:
        assertNotNull(value);
        assertNotNull(currency);

        this.value = value;
        this.currency = currency;
    }
    [...]
}

价值(例如 100)和货币(例如欧元)共同描述了事物的价值。这东西不值“100”,不只是 "eur",而是“100 欧元”。

值对象的比较也很重要。在谈论货币价值时,需要比较价值和货币这两个属性。比较没有货币的价值不会有太大帮助,因为 100 美元与 100 欧元不同。这进一步表明 MonetaryValue 可能是一个合理的值对象。