货币是否是价值对象

时间:2011-04-16 22:02:04

标签: c# oop domain-driven-design value-objects

我有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的货币。

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

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

2 个答案:

答案 0 :(得分:4)

如果您使用货币定义应用程序中的货币定义,如USD,EGP,EUR,..等等,它应该是可重复使用的实体。如果你的意思是货币金额的价值,比如1000美元,它就是一个封装金额和货币类型的价值对象。

答案 1 :(得分:4)

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

  

表示a的对象   域的描述性方面   没有概念身份被称为a   价值对象。价值目标是   实例化以表示元素   我们唯一关心的设计   他们是什么,而不是他们是谁   是

关于这方面的另一个参考是由Dave Laribee撰写的关于Domain Driven Design的MSDN文章,他说:

  

值对象是描述符或   属性在域中很重要   正在建模。与实体不同,他们这样做   没有身份;他们很简单   描述确实存在的事物   身份。你在改变一个实体吗?   被称为“三十五美元”或者是   你增加了一个平衡   帐户?

使用这两个引用我会说Currency应该是一个Value Object而不是一个实体。货币在一段时间内没有任何形式的身份 - 它是个人实体的描述性财产 - 我猜他们希望收取的货币。

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

另一个可以帮助你的好文章由Jimmy Bogard

撰写

在您提供其他信息后:

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

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

要更新数据库中的货币(例如更改主要商店货币)或列出可用货币,您不需要通过聚合,所有数据访问都不需要聚合 - 它们只提供服务以可管理的方式协调实体之间的关系。