前两篇文章主要实现了经销商代注册的仓储与领域逻辑、经销商登陆的仓储与相关逻辑,这篇文章主要讲述经销商代注册的用例与经销商登陆的查询功能。微信
在经销商代注册用例中,咱们须要传递经销商的基本注册信息,这个信息是作成了DTO对象。ssh
public class AddDealerDTO
{
public string Name { get; set; }
public string Tel { get; set; }
public decimal EleMoney { get; set; }
public Guid? Parentid { get; set; }
public List<string> ContactNames { get; set; }
public List<string> ContactTels { get; set; }
public List<string> ContactProvinces { get; set; }
public List<string> ContactCities { get; set; }
public List<string> ContactZeors { get; set; }
public List<string> ContactStreets { get; set; }
public List<int> IsDefaultContact { get; set; }
}
复制代码
在上述DTO对象中,Name和Tel属性是子经销商的名字和电话号码;EleMoney表明子经销商注册时的电子币,从领域逻辑中能够看到,电子币会从父经销商扣除并附加到子经销 商,而且根据EleMoney肯定了子经销商的级别;Parentid是当前登陆的父经销商的Id;其余剩余属性是子经销商的联系信息。ide
public class AddDealerUseCase:BaseAppSrv
{
private readonly IRepository irepository;
private readonly IDealerRepository idealerrepository;
private readonly ILoginRepository iloginrepository;
public AddDealerUseCase(IRepository irepository, IDealerRepository idealerrepository,
ILoginRepository iloginrepository)
{
this.irepository = irepository;
this.idealerrepository = idealerrepository;
this.iloginrepository = iloginrepository;
}
public ResultEntity<bool> AddDealer(AddDealerDTO adddealerdto)
{
var dealerid = Guid.NewGuid();
var dealercontacts = new List<Contact>();
for(int i = 0; i < adddealerdto.ContactNames.Count; i++)
{
var dealercontact = 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);
}
var dealer = new Dealers(idealerrepository).RegisterDealer(dealerid, adddealerdto.Name,
adddealerdto.Tel, adddealerdto.EleMoney, dealercontacts, adddealerdto.Parentid);
var login = 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();
}
return GetResultEntity(true);
}
catch (OverTowSubException error)
{
throw error;
}
catch(Exception error)
{
throw error;
}
}
}
复制代码
从上面代码能够看到,调用了注册经销商的逻辑,而且调用了相关仓储进行父经销商电子币扣除、将父经销商子个数加一、并持久化子经销商信息,若是父经销商的子 经销商个数超过2个,则抛出OverTowSubException异常。ui
这里再也不讲述经销商注册的WebApi实现,能够参考前面的文章实现相应的WebApi。this
经销商登陆时,只须要传递电话号码和密码就能够了,因此先定义相关的DTO对象。idea
public class UserLoginDTO
{
public string Telphone { get; set; }
public string Password { get; set; }
}
复制代码
经销商登陆这个功能不是一个用例,应该叫查询,调用前面文章实现的查询逻辑便可实现。spa
public class UserLoginQuery:BaseAppSrv
{
private readonly IRepository irepository;
private readonly 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;
}
}
}
复制代码
在前一篇文章中,咱们实现了登陆成功时令牌生成的逻辑,因此在WebApi中,若是经销商登陆成功,咱们将返回经销商的Id、电话号码与Token信息,这些 信息存储到一个DTO对象中。code
public class UserLoginResultDTO
{
public string Tel { get; set; }
public Guid DealerId { get; set; }
public string Token { get; set; }
}
复制代码
而后实现WebApi接口orm
[AllowAnonymous]
[HttpPost]
[Route("UserLogin")]
public ResultEntity<UserLoginResultDTO> UserLogin([FromBody] UserLoginDTO userlogindto)
{
var result = new ResultEntity<UserLoginResultDTO>();
var idealercontext = servicelocator.GetService<IDealerContext>();
var irepository =
servicelocator.GetService<IRepository>(new ParameterOverrides { { "context", idealercontext } });
var iloginrepository = servicelocator.GetService<ILoginRepository>(new ParameterOverrides { { "context", idealercontext } });
UserLoginQuery userloginquery = new UserLoginQuery(irepository, iloginrepository);
try
{
var dealerid = userloginquery.Login(userlogindto);
if (dealerid != Guid.Empty)
{
var token = new JwtTokenBuilder()
.AddSecurityKey(JwtSecurityKey.Create("msshcjsecretmsshcjsecret"))
.AddSubject(userlogindto.Telphone)
.AddIssuer("DDD1ZXSystem")
.AddAudience("DDD1ZXSystem")
.AddClaim("role", "NormalUser")
.AddExpiry(600)
.Build();
var userloginresultdto = 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的相关方法说明请参考前一篇文章。cdn
DDD实战进阶视频请关注微信公众号:MSSHCJ