現在のプロジェクトでDDDのプリンシパルを適用しようとしています。うまくいけば意味のある例を使って、この(長い間)質問をしてみます。
新しいメンバーを作成するとき、私のプレゼンテーション層は、アプリケーション層で定義されているMemberService.CreateMember(MemberDTO memberDTO)を呼び出します。
私のプレゼンテーション層には次のようなものがあります。
MemberDTO member = new MemberDTO(); //Defined in Application Layer
member.Username = username;
member.Password = password;
//...etc
私のアプリケーション層は、ドメイン層で次のファクトリメソッドを呼び出してメンバーを作成します。
public static Member MemberFactory.CreateMember(string memberDTO.Username, string memberDTO.Password...)
{
var member = new Member(); //Domain.Model.Member
member.Id = GenerateIdentity();
member.Username = memberDTO.Username;
//... etc
return member;
}
メンバーはMemberService(アプリケーション層)に戻され、MemberService(インフラストラクチャ層のリポジトリ)に保存され、MemberDTOにマップされ(AutoMapperを使用)、プレゼンテーション層に戻されます。
したがって、プレゼンテーション層はMemberDTOで値を設定し、次にドメイン層(ファクトリ経由)は個々のパラメーターを取得してメンバーの値を設定します。ファクトリがなければ簡単ですが、ここでIDを生成しています。IDを生成する代わりにドメインサービスを作成するのは間違っているでしょうか?たとえば、MemberService.CreateMember(MemberDTO memberDTO)メソッドを次のように変更します。
public MemberDTO CreateMember(MemberDTO memberDTO)
{
var member = MemberFactory.CreateMember(memberDTO.Username, memberDTO.Password);
//Domain.Model.Member
SaveMember(member);
//Pass DTO to presentation layer
return Mapper.Map<Member, MemberDTO>(member);
}
これに:
public MemberDTO CreateMember(MemberDTO memberDTO)
{
var member = new Member(); //Domain.Model.Member
Mapper.Map<MemberDTO, Member>(memberDTO);
//Add this method into a Domain Service to generate the ID and any other defaults
Domain.MemberService.Initialise(member);
SaveMember(member);
//Pass DTO to presentation layer
return Mapper.Map<Member, MemberDTO>(member);
}
答えは単純な「はい」または「いいえ」である可能性がありますが、長い質問で申し訳ありません。