我将尝试在当前项目中应用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;
}
该Member被传回到MemberService(应用层),该层将其保存(基础架构层中的Repository)并映射为MemberDTO(使用AutoMapper),然后将其传回到Presentation Layer。
因此,我的Presentation Layer正在设置MemberDTO中的值,然后我的Domain Layer(通过Factory)正在接受单个参数并设置Member的值。如果没有工厂,这将是简单的,但我在这里生成Id。创建一个Domain Service来生成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);
}
非常抱歉提出冗长的问题,尽管答案可能是简单的是或否!