ドメイン オブジェクトは何のために必要ですか?
アプリケーションにドメイン オブジェクトが必要ない場合があります。通常、DDD は次のようにサービス レイヤーに適合します。 サービス レイヤーは、操作コントラクトとデータ コントラクトを公開します。多くの場合、データ コントラクト クラスはドメイン内のオブジェクトに対応しますが、動作を持たないためドメイン オブジェクトではなく、特定のサービスが関係するデータの表現にすぎません。サービス内のデータ コントラクト オブジェクトとドメイン オブジェクト間の相互作用の簡単な例を次に示します。
public MyEntityDto GetMyEntity(string id) {
var entity = this.myEntityRepository.Get(id);
if (entity == null)
return null;
return new MyEntityDto(entity);
};
この場合、MyEntityDto は MyEntity のDTOオブジェクトであり、サービスがクライアントに提供したい MyEntity の特定のプロパティを公開する役割を果たします。
DDD の価値が発揮されるのは、ドメインがより複雑で、関連する動作がある場合です。
class MyEntity {
public void ChangeState(MyEntityState state) {
if (!IsValidState(state))
throw new Exception("Not a valid state.");
// further domain logic here...
}
}
[DataContract]
class ChangeStateCommand {
[DataMember]
public string MyEntityId { get; set; }
[DataMember]
public string State { get; set; }
}
public void Process(ChangeStateCommand command) {
var entity = this.myEntityRepository.Get(command.MyEntityId);
if (entity == null)
throw new SomeException().
entity.ChangeState(command.State);
this.myEntityRepository.Commit();
}
この場合、ChangeStateCommand で運ばれたデータは、ドメイン エンティティを操作するために使用されます。