C# 如何在域驱动设计中指定用户限制?

C# 如何在域驱动设计中指定用户限制?,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

如何在域驱动中为用户指定限制

我使用的是asp.net web api应用程序,该应用程序服务使用的是web api

[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");
    }
    ....
}