0

我有 Person 聚合,它是根聚合

public class Person 
{
    private int id;
    private readonly PersonID personID;

    private readonly string email;
    private readonly string firstName;
    private readonly string lastName;

    private readonly string username;
    private readonly string password;
    private readonly Address BillingAddress;
}

public class Currency : IValueObject<Currency>
{
    private string name;
    private string currencyCode;
    private decimal rate;
    private string displayLocale;
    private string customFormatting;
    private int displayOrder;
    private bool primaryExchangeRateCurrency;
    private bool primaryStoreCurrency;

    //<summary>
    //Gets or a value indicating whether the currency is primary exchange rate currency
    //</summary>

    public bool IsPrimaryExchangeRateCurrency
    {
       get
       {
           return primaryExchangeRateCurrency;
       }
    }

   /// <summary>
    /// Gets or a value indicating whether the currency is primary store currency
    /// </summary>

    public bool IsPrimaryStoreCurrency
    {
         get
         {
                return primaryStoreCurrency;
         }
    }
}

和 Currency 类,将在 Person 类中引用。

所以现在如果创建了一个 Person 实体,我们也需要将它与货币相关联。但是在所有创建的货币中,我想知道哪个是默认的主要商店货币。我不想通过 Person 知道它,因为它只包含单一货币。我想从所有创建的人的货币中获得一种货币,即 PrimaryStoreCurrency。

我想在下拉列表中绑定货币,以便用户可以从下拉列表中选择其货币并在我们的系统中注册。

那么,我是否将货币创建为单独的聚合?

4

2 回答 2

5

如果您所说的 Currency 是指应用程序中的货币定义,例如 USD、EGP、EUR、.. 等等,它应该是可重用的实体。如果您指的是货币金额的价值,例如 1000 美元,那么它是一个封装金额和货币类型的值对象。

于 2011-04-16T22:17:16.800 回答
4

以下引用来自 Eric Evans,他在其中描述了值对象是什么:

表示域的描述性方面但没有概念标识的对象称为 VALUE OBJECT。值对象被实例化以表示我们只关心它们是什么而不关心它们是谁或它们是谁的设计元素。

对此的另一个参考是Dave Laribee 撰写的关于域驱动设计的 MSDN 文章,他说:

值对象是您正在建模的领域中重要的描述符或属性。与实体不同,它们没有身份;它们只是描述了具有身份的事物。您是要更改一个名为“三十五美元”的实体,还是要增加帐户余额?

使用这两个引用我会说 Currency 应该是一个值对象而不是一个实体。货币在时间上没有任何形式的身份——它是个人实体的描述性属性——我猜他们更喜欢用这种货币计费。

在两个不同的聚合中使用相同的值对象完全没有问题。

Jimmy Bogard写的另一篇可能对您有帮助的好帖子


在您的附加信息之后:

我仍然会说,最好将货币建模为价值对象——它似乎仍然是不可变的。

当您加载 Person 聚合时,您需要该查询的一部分加载作为主要商店货币的货币值对象。

对于更新数据库中的货币(例如更改哪个是主要商店货币)或列出可用货币,您不需要通过聚合,聚合不是所有数据访问的强制性 - 它们仅用于协调实体之间的关系以可管理的方式。

于 2011-04-16T22:18:26.607 回答