C# 如何在域驱动设计中指定用户限制?
如何在域驱动中为用户指定限制 我使用的是asp.net web api应用程序,该应用程序服务使用的是web apiC# 如何在域驱动设计中指定用户限制?,c#,asp.net-core,design-patterns,architecture,domain-driven-design,C#,Asp.net Core,Design Patterns,Architecture,Domain Driven Design,如何在域驱动中为用户指定限制 我使用的是asp.net web api应用程序,该应用程序服务使用的是web api [ApiController] public class TicketController : ControllerBase { .... .... [HttpPost] [Route("change-date")] public async Task<IActionResult> ChangeTicketDate(Ticket
[ApiController]
public class TicketController : ControllerBase
{
....
....
[HttpPost]
[Route("change-date")]
public async Task<IActionResult> ChangeTicketDate(TicketChangeCommand command)
{
var response = await _ticketService.ChangeTicketDate(command, User.Identity.Name);
return Ok(response);
}
....
....
}
要检查用户角色和所有者,我应该创建域服务吗?我应该创建一个域授权服务来检查角色吗?正如我在DDD中看到的那样,您应该在DomainModel类中有一些方法来执行此操作,例如
ChangeTicketDate
现在,如果您在创建票证时存储票证创建者的信息“,我相信您会这样做”,验证应该是DomainModel本身的一部分,例如。
ChangeTicketDate(字符串用户名)
然后DomainService“或ApplicationService”应该只将该值传递给域模型类,验证应该在域类中进行
然而,在某些情况下,您可能需要在域模型之前实现一些验证,或者说它与实体本身无关,这些验证应该在您的应用程序服务中
我想下面的代码将更好地解释我的想法
公共类票务服务:ITicketService
{
// ....
//我希望您能够获得有关当前用户的一些信息
public CurrentUserData CurrentUser{get;private set;}
公共票证更改票证日期(票证更改命令){
//1.从Data StoreCheck加载聚合根
var ticket=db.GetById(ticketId);
//2.执行一些应用程序级检查
//3.检查当前用户是否为管理员
if(CurrentUser.IsAdmin)
ticket.ChangeTicketDate();
其他的
ticket.ChangeTicketDate(CurrentUser.Username);
}
....
}
//域模型类示例
公共舱位票:实体
{
公共用户信息创建者{get;private set;}
public void ChangeTicketDate(字符串requestedUsername){
如果(!string.IsNullOrEmpty(requestedUsername)&&requestedUsername!=Creator.UserName)
抛出新的ValidationException(“不允许您执行ChangeTicketDate”);
}
....
}
我认为为这项服务单独提供服务确实是一种很好的做法。但这不是领域驱动的设计。若有什么我同意的话,那个么这个问题和DDD根本并没有关系。但看看如何使用政策来实现这一点
public class TicketService : ITicketService
{
....
public TicketChange ChangeTicketDate(TicketChangeCommand command, string requestedUsername){
// 1. Check requested user is ticket creator or Administrator
}
....
}
public class TicketService : ITicketService
{
// ....
// I expect that you'll be able to get some information about the current user
public CurrentUserData CurrentUser {get; private set;}
public TicketChange ChangeTicketDate(TicketChangeCommand command){
// 1. Load the Aggregate Root from the Data StoreCheck
var ticket = db.GetById(ticketId);
// 2. Do some Application level checks
// 3. Check if the current user is Admin
if(CurrentUser.IsAdmin)
ticket.ChangeTicketDate();
else
ticket.ChangeTicketDate(CurrentUser.Username);
}
....
}
//Example of Domain Model class
public class Ticket : Entity<Guid>
{
public UserInfo Creator {get; private set;}
public void ChangeTicketDate(string requestedUsername){
if(!string.IsNullOrEmpty(requestedUsername) && requestedUsername != Creator.UserName)
threw new ValidationException("You're not allowed to do ChangeTicketDate");
}
....
}