【问题标题】:DDD how to handle value objects without repositoryDDD如何处理没有存储库的值对象
【发布时间】:2017-03-17 00:16:28
【问题描述】:

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

我有实体卡,它具有泛货币(美元、欧元、英镑)和卡类型(Visa、Visa Electron、万事达卡)。我认为货币和卡类型是价值对象,它们存储在源代码中。根据 DDD 值对象没有存储库。

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

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

更新1

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

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

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

【问题讨论】:

  • 什么是“停止处理美元付款”?这意味着对于您的应用程序,美元不再用于新交易,或者应该删除所有具有美元的东西?当您停止使用美元时,您存储的数据会怎样?在我看来,这比域建模更像是一个验证问题。从您的领域角度考虑。
  • 表示您不能以美元订购卡,或者您不能以美元汇款。不应该删除任何内容。
  • 因此 USD 作为可能值仍然存在于您的域中,您不必从枚举中删除它。
  • 我必须从用户界面下拉菜单中删除它,但我不会删除购买的卡或美元转账

标签: domain-driven-design value-objects


【解决方案1】:

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

你的情况呢,创建3个表就行了,不要试图把简单的事情复杂化:

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

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

【讨论】:

    【解决方案2】:

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

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

    public enum Currency{
        USD, EUR, GBP
    }
    

    然后从代码中:

    Currency.values()
    

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

    很多时候我因为这个解决方案而受到批评,比如“我需要一个价值描述”之类的论点,比如当你有欧元值时,在一个视图中写“欧元”,如果你有一张桌子,你可以有一个描述栏。
    这可以使用如下属性文件轻松解决:

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

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

    【讨论】:

      【解决方案3】:

      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)和货币(例如 eur)一起描述了事物的价值。这东西不仅值“100”,而且不只是“eur”,而是“100 eur”。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-24
        • 2023-01-20
        • 1970-01-01
        相关资源
        最近更新 更多