AdventureWorksをモデリングしてDDDしながらドメインモデルで実装してみる(9)

VALUE OBJECTを利用してエンティティ内のデータをグループ化する

VALUE OBJECTの使うことでより粒度が小さく1クラス1責務に近づけることができます。連絡先エンティティも情報グループごとにVALUE OBJECTで切り出すことができます。Castle ActiveRecordの場合、Nested属性を利用すると簡単にVALUE OBJECTにもマッピングできます。

[ActiveRecord(Schema = "Person")]
public class Contact : ActiveRecordBase<Contact>
{
    public string Name 
    { 
        get { return PersonName.Name; } 
    }
    
    [PrimaryKey]
    public virtual int ContactID { get; set; }
    [Nested]
    public virtual PersonName PersonName { get; set; }
    [Nested]
    public virtual EmailAddress Email { get; set; }
    [Nested]
    public virtual Phone Phone { get; set; }
    [Nested]
    public virtual AdditionalContactInfo Additional { get; set; }
}

public class EmailAddress
{
    [Property(Column = "EmailAddress")]
    public virtual string Address { get; protected set; }
    [Property(Column = "EmailPromotion")]
    public virtual bool Promotion { get; protected set; }
    [Property]
    public string PasswordHash { get; protected set; }
    [Property]
    public string PasswordSalt { get; protected set; }
}


あとはパスワードチェックの機能要求が発生した場合、EmailAddressクラスで実装してくことになります。このような考え方で進めれば、いくらでもドメインモデル内で実装することができます。
汎用的なVALUE OBJECTは複数のアプリケーションで再利用することもできるメリットもあります。DDDのサイトにも再利用可能なTime and Money Code Library(Java)のサンプルがあります。