我需要一些值对象的帮助。请考虑以下示例。
我有实体卡,其中包含泛货币(美元,欧元,英镑)和卡类型(Visa,Visa Electron,Mastercard)。我认为货币和卡片类型是价值对象,它们存储在源代码中。根据DDD值,对象不具备存储库。
一个简单的例子是无价的"
UPDATE1
这是我的第一个方法但是...... 我在其他实体中使用货币,比如MoneyTransfer,我使用EUR USD GBP和更多,所以我必须再创建一个枚举
public enum MoneyTransferCurrency{
USD, EUR, GBP and a few other
}
这种方式我复制了一些货币,如果我们停止处理美元付款,我必须找到所有枚举并删除美元货币。
答案 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)
Currency
和CardType
不一定是明智的价值对象。值对象模拟包含相关属性的概念整体。可以通过比较所有属性来比较值对象。
考虑一个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
可能是一个合理的价值对象。