Во-первых, я согласен с комментарием @ Yahia, что нет общего ответа.С учетом вышесказанного, вот как я подхожу к этому.
Для начала я бы, вероятно, пошел с двойной проверкой - один раз в моем контроллере, когда запрос был впервые получен, а затем в моем домене какэто обрабатывает команду.Некоторые могут не согласиться с этим, но я бы предпочел, чтобы команда не выдавалась и немедленно сообщала пользователю, что он не авторизован для выполнения какого-либо действия, вместо того, чтобы выполнить команду и полагаться на возможную согласованность для уведомления об ошибке для предупрежденияпосле того, как пользователь не смог выполнить действие.
Итак, с точки зрения псевдокода, вот мой подход к редактированию сотрудника:
Контроллер
[HttpPost]
ActionResult Edit(Employee emp){
//get employee org information from _employeeRepository
//validate if _loggedInUserID is able to edit emp.ID
if(isValid) {
//construct command
_commandService.EnqueueCommand(new EditEmployee(emp.ID, emp.Name, emp.Salary));
} else {
return View("PermissionError");
}
return Redirect("EmployeeProperties");
}
Итак, моя командная служба берет команду и направляет ее к соответствующему AR в моем домене, который будет Employee.
Домен Employee
protected void EditEmployee(userID, employeeID, employeeName, salary){
//get employee org information from _employeeRepository
//validate if userID is able to edit employeeID
if(isValid) {
//apply event
ApplyEvent(new EmployeeEdited(userID, employeeID, employeeName, salary));
}
}
Итак, я бы применил одну и ту же проверку безопасности как на своем контроллере, так и в своем домене.Я мог бы использовать это, вероятно, как инкапсулированный метод (ну, вероятно, инкапсулированный класс критериев, который я передам в хранилище).
Так что я надеюсь, что это поможет при подходе к этому сценарию.Дайте мне знать, если есть вопросы, и я уточню в своем ответе.
Надеюсь, это поможет.Удачи!