領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)實(shí)戰(zhàn)進(jìn)階第一波(十一):實(shí)現(xiàn)經(jīng)銷商代注冊(cè)用例與登錄令牌發(fā)放

DDD實(shí)戰(zhàn)進(jìn)階第一波(十一):開發(fā)一般業(yè)務(wù)的大健康行業(yè)直銷系統(tǒng)(實(shí)現(xiàn)經(jīng)銷商代注冊(cè)用例與登錄令牌分發(fā))

前兩篇文章主要實(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):

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 業(yè)務(wù)場(chǎng)景 客戶需要在頁(yè)面有一個(gè)打印按鈕,點(diǎn)擊之后可以打印Echarts圖表的內(nèi)容以及文字提示信息,經(jīng)谷歌搜索發(fā)現(xiàn),...
    彩虹的夜晚閱讀 4,916評(píng)論 0 5
  • 沒你的日子, 太陽(yáng)尚且明亮, 有時(shí)也會(huì)被烏云遮擋, 晚上還有月亮。 有你的日子, 我關(guān)上了門窗、 拉上了簾帳, 思...
    阿Uuuu閱讀 302評(píng)論 0 0
  • 早上送走一寧去學(xué)校,準(zhǔn)備計(jì)劃和一寧爸爸去老家看看孩子爺爺奶奶,順便帶著小毛毛一起回去玩玩,提前一天給一鳴向葛老師請(qǐng)...
    陳一寧媽媽閱讀 253評(píng)論 0 3

友情鏈接更多精彩內(nèi)容