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)のサンプルがあります。