我想在當前的項目中應用DDD的校長。我會試着用一個希望有意義的例子來問這個(冗長的)問題。將DTO界面傳遞到域工廠?
創建新成員時,我的表示層調用應用程序層中定義的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(應用層)將其保存(存儲庫位於基礎結構層)並將其映射到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);
}
對不起,囉嗦的問題,儘管答案可能是一個簡單的是或沒有!
謝謝@dtryon,我簡化了這個例子的域名。唯一的事情就是在'To this:'部分,我不再使用Factory來創建成員的實例。這就是爲什麼我認爲像'Initialise'方法也設置默認值,即。 'Member.IsVerified = false;'或者我應該只在會員的構造函數中設置它們? –
如果'Member.IsVerified'是一個布爾值,默認情況下它將被設置爲false。如果你有更復雜的創建,我會看看[Builder](http://www.dofactory.com/Patterns/PatternBuilder.aspx)這樣的模式。不過,我建議您分別關注與配置,默認值和身份生成相關的問題。在與成員打交道時,這些看起來都是獨立的問題。 –
謝謝,正如我對Aaron所說的,在這種情況下,MemberFactory只是一個開銷,因爲我將DTO中的各個參數傳遞到工廠並手動將這些參數映射到域模型。 –