前兩篇文章主要實(shí)現(xiàn)了經(jīng)銷商代注冊(cè)的倉(cāng)儲(chǔ)與領(lǐng)域邏輯、經(jīng)銷商登錄的倉(cāng)儲(chǔ)與相關(guān)邏輯,這篇文章主要講述經(jīng)銷商代注冊(cè)的用例與經(jīng)銷商登錄的查詢功能。
一.經(jīng)銷商代注冊(cè)用例
在經(jīng)銷商代注冊(cè)用例中,我們需要傳遞經(jīng)銷商的基本注冊(cè)信息,這個(gè)信息是做成了DTO對(duì)象。
1.經(jīng)銷商注冊(cè)的DTO對(duì)象:
publicclass AddDealerDTO
? ? {
? ? ? ? publicstringName {get;set; }
? ? ? ? publicstringTel {get;set; }
? ? ? ? publicdecimalEleMoney {get;set; }
? ? ? ? publicGuid? Parentid {get;set; }
? ? ? ? publicList ContactNames {get;set; }
? ? ? ? publicList ContactTels {get;set; }
? ? ? ? publicList ContactProvinces {get;set; }
? ? ? ? publicList ContactCities {get;set; }
? ? ? ? publicList ContactZeors {get;set; }
? ? ? ? publicList ContactStreets {get;set; }
? ? ? ? publicList IsDefaultContact {get;set; }
? ? }
在上述DTO對(duì)象中,Name和Tel屬性是子經(jīng)銷商的名字和電話號(hào)碼;EleMoney代表子經(jīng)銷商注冊(cè)時(shí)的電子幣,從領(lǐng)域邏輯中可以看到,電子幣會(huì)從父經(jīng)銷商扣除并附加到子經(jīng)銷商,并且根據(jù)EleMoney確定了子經(jīng)銷商的級(jí)別;Parentid是當(dāng)前登錄的父經(jīng)銷商的Id;其他剩余屬性是子經(jīng)銷商的聯(lián)系信息。
2.經(jīng)銷商注冊(cè)用例:
publicclass AddDealerUseCase:BaseAppSrv
? ? {
? ? ? ? privatereadonly IRepository irepository;
? ? ? ? privatereadonly IDealerRepository idealerrepository;
? ? ? ? privatereadonly ILoginRepository iloginrepository;
? ? ? ? public AddDealerUseCase(IRepository irepository, IDealerRepository idealerrepository,
? ? ? ? ? ? ILoginRepository iloginrepository)
? ? ? ? {
? ? ? ? ? ? this.irepository = irepository;
? ? ? ? ? ? this.idealerrepository = idealerrepository;
? ? ? ? ? ? this.iloginrepository = iloginrepository;
? ? ? ? }
? ? ? ? publicResultEntity AddDealer(AddDealerDTO adddealerdto)
? ? ? ? {
? ? ? ? ? ? vardealerid = Guid.NewGuid();
? ? ? ? ? ? vardealercontacts =newList();
? ? ? ? ? ? for(inti =0; i < adddealerdto.ContactNames.Count; i++)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? vardealercontact =new Contact().CreateContact(dealerid, adddealerdto.ContactNames[i],
? ? ? ? ? ? ? ? ? ? adddealerdto.ContactTels[i], adddealerdto.ContactProvinces[i],
? ? ? ? ? ? ? ? ? ? adddealerdto.ContactCities[i], adddealerdto.ContactZeors[i], adddealerdto.ContactStreets[i],
? ? ? ? ? ? ? ? ? ? adddealerdto.IsDefaultContact[i]);
? ? ? ? ? ? ? ? dealercontacts.Add(dealercontact);
? ? ? ? ? ? }
? ? ? ? ? ? vardealer =new Dealers(idealerrepository).RegisterDealer(dealerid, adddealerdto.Name,
? ? ? ? ? ? ? ? adddealerdto.Tel, adddealerdto.EleMoney, dealercontacts, adddealerdto.Parentid);
? ? ? ? ? ? varlogin =new Login().CreateLogin(dealer.Tel, dealerid);
? ? ? ? ? ? try? ? ? ? ? ? {
? ? ? ? ? ? ? ? using (irepository)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? idealerrepository.CreateDealer(dealer);
? ? ? ? ? ? ? ? ? ? if(adddealerdto.Parentid !=null)
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? idealerrepository.SubParentEleMoney(Guid.Parse(adddealerdto.Parentid.ToString()),
? ? ? ? ? ? ? ? ? ? ? ? ? ? adddealerdto.EleMoney);
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? idealerrepository.AddParentSubCount(adddealerdto.Parentid);
? ? ? ? ? ? ? ? ? ? iloginrepository.CreateLogin(login);
? ? ? ? ? ? ? ? ? ? irepository.Commit();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? returnGetResultEntity(true);
? ? ? ? ? ? }
? ? ? ? ? ? catch (OverTowSubException error)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? throw error;
? ? ? ? ? ? }
? ? ? ? ? ? catch(Exception error)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? throw error;
? ? ? ? ? ? }
? ? ? ? }
? ? }
從上面代碼可以看到,調(diào)用了注冊(cè)經(jīng)銷商的邏輯,并且調(diào)用了相關(guān)倉(cāng)儲(chǔ)進(jìn)行父經(jīng)銷商電子幣扣除、將父經(jīng)銷商子個(gè)數(shù)加1、并持久化子經(jīng)銷商信息,如果父經(jīng)銷商的子經(jīng)銷商個(gè)數(shù)超過(guò)2個(gè),則拋出OverTowSubException異常。
這里不再講述經(jīng)銷商注冊(cè)的WebApi實(shí)現(xiàn),可以參考前面的文章實(shí)現(xiàn)相應(yīng)的WebApi。
二.經(jīng)銷商登錄功能
經(jīng)銷商登錄時(shí),只需要傳遞電話號(hào)碼和密碼就可以了,所以先定義相關(guān)的DTO對(duì)象。
1.經(jīng)銷商登錄的DTO對(duì)象
publicclass UserLoginDTO
? ? {
? ? ? ? publicstringTelphone {get;set; }
? ? ? ? publicstringPassword {get;set; }
? ? }
2.經(jīng)銷商登錄查詢
經(jīng)銷商登錄這個(gè)功能不是一個(gè)用例,應(yīng)該叫查詢,調(diào)用前面文章實(shí)現(xiàn)的查詢邏輯即可實(shí)現(xiàn)。
publicclass UserLoginQuery:BaseAppSrv
? ? {
? ? ? ? privatereadonly IRepository irepository;
? ? ? ? privatereadonly ILoginRepository iloginrepository;
? ? ? ? public UserLoginQuery(IRepository irepository, ILoginRepository iloginrepository)
? ? ? ? {
? ? ? ? ? ? this.iloginrepository = iloginrepository;
? ? ? ? ? ? this.irepository = irepository;
? ? ? ? }
? ? ? ? public Guid Login(UserLoginDTO userlogindto)
? ? ? ? {
? ? ? ? ? ? try? ? ? ? ? ? {
? ? ? ? ? ? ? ? using (irepository)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? return iloginrepository.UserLogin(userlogindto.Telphone, userlogindto.Password);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? catch(Exception error)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? throw error;
? ? ? ? ? ? }
? ? ? ? }
? ? }
3.經(jīng)銷商登錄的WebApi
在前一篇文章中,我們實(shí)現(xiàn)了登錄成功時(shí)令牌生成的邏輯,所以在WebApi中,如果經(jīng)銷商登錄成功,我們將返回經(jīng)銷商的Id、電話號(hào)碼與Token信息,這些信息存儲(chǔ)到一個(gè)DTO對(duì)象中。
publicclass UserLoginResultDTO
? ? {
? ? ? ? publicstringTel {get;set; }
? ? ? ? publicGuid DealerId {get;set; }
? ? ? ? publicstringToken {get;set; }
? ? }
然后實(shí)現(xiàn)WebApi接口
[AllowAnonymous]
? ? ? ? [HttpPost]
? ? ? ? [Route("UserLogin")]
? ? ? ? publicResultEntity UserLogin([FromBody] UserLoginDTO userlogindto)
? ? ? ? {
? ? ? ? ? ? varresult =newResultEntity();
? ? ? ? ? ? varidealercontext = servicelocator.GetService();
? ? ? ? ? ? varirepository =? ? ? ? ? ? ? ? servicelocator.GetService(newParameterOverrides { {"context", idealercontext } });
? ? ? ? ? ? variloginrepository = servicelocator.GetService(newParameterOverrides { {"context", idealercontext } });
? ? ? ? ? ? UserLoginQuery userloginquery =new UserLoginQuery(irepository, iloginrepository);
? ? ? ? ? ? try? ? ? ? ? ? {
? ? ? ? ? ? ? ? vardealerid = userloginquery.Login(userlogindto);
? ? ? ? ? ? ? ? if(dealerid != Guid.Empty)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? vartoken =new JwtTokenBuilder()
? ? ? ? ? ? ? ? ? ? ? ? .AddSecurityKey(JwtSecurityKey.Create("msshcjsecretmsshcjsecret"))
? ? ? ? ? ? ? ? ? ? ? ? .AddSubject(userlogindto.Telphone)
? ? ? ? ? ? ? ? ? ? ? ? .AddIssuer("DDD1ZXSystem")
? ? ? ? ? ? ? ? ? ? ? ? .AddAudience("DDD1ZXSystem")
? ? ? ? ? ? ? ? ? ? ? ? .AddClaim("role","NormalUser")? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? .AddExpiry(600)
? ? ? ? ? ? ? ? ? ? ? ? .Build();
? ? ? ? ? ? ? ? ? ? varuserloginresultdto =new UserLoginResultDTO();
? ? ? ? ? ? ? ? ? ? userloginresultdto.Tel = userlogindto.Telphone;
? ? ? ? ? ? ? ? ? ? userloginresultdto.DealerId = dealerid;
? ? ? ? ? ? ? ? ? ? userloginresultdto.Token = token.Value;
? ? ? ? ? ? ? ? ? ? result.IsSuccess =true;
? ? ? ? ? ? ? ? ? ? result.Data = userloginresultdto;
? ? ? ? ? ? ? ? ? ? result.Msg ="登錄成功!";
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? else? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? result.ErrorCode =300;
? ? ? ? ? ? ? ? ? ? result.Msg ="登錄失敗!";
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? catch (Exception error)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? result.ErrorCode =200;
? ? ? ? ? ? ? ? result.Msg = error.Message;
? ? ? ? ? ? }
? ? ? ? ? ? return result;
? ? ? ? }
?上述代碼中JwtTokenBuilder的相關(guān)方法說(shuō)明請(qǐng)參考前一篇文章。
QQ討論群:309287205
DDD實(shí)戰(zhàn)進(jìn)階視頻請(qǐng)關(guān)注微信公眾號(hào):
