DDD如何处理没有存储库的值对象

时间:2016-11-03 12:05:56

标签: domain-driven-design value-objects

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

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

  1. 问题是如何填写货币和卡片的下拉列表 创建新卡实体时界面中的类型。
  2. 将这些类放在Application,Domain或Infrastructure层中的位置 以及如何从中检索数据。
  3. 一个简单的例子是无价的"

    UPDATE1

    这是我的第一个方法但是...... 我在其他实体中使用货币,比如MoneyTransfer,我使用EUR USD GBP和更多,所以我必须再创建一个枚举

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

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

3 个答案:

答案 0 :(得分:1)

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

你的情况如何,只需创建3个表,不要试图让简单的事情变得复杂:

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

对于DropDowns,您只需查询Currency& CardType表。如果您将来添加新的货币或CardType,将很容易做到。

答案 1 :(得分:1)

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

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

public enum Currency{
    USD, EUR, GBP
}

然后从代码中获取:

Currency.values()

问问自己,这些价值经常发生变化的频率如何? (系统使用新货币的频率是多少?)
开发和维护系统(如db表)的成本是否需要动态删除这些值,而不是重新启动应用程序而不是使用枚举,并在发生更改时重新编译项目?

很多时候我被这个解决方案批评过像#34;我需要对价值进行描述",就像写作"欧元"当你有欧元价值时,如果你有一张表,你可以有一个描述栏 这可以使用如下属性文件轻松解决:

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

同时检查:
- Loading a Value object in List or DropdownList, DDD
- Simple aggregate root and repository question

答案 2 :(得分:0)

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 eur"。

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