У меня есть следующий код в моей службе приложений: < /p>
namespace Application;
public class UserService : IUserService
{
private readonly IUserRepository _userRepository;
private readonly IMapper _mapper;
private readonly ICurrentUserService _currentUserService;
private readonly ICreateUserPolicy _createUserPolicy;
private readonly IModifyUserPolicy _modifyUserPolicy;
public UserService(
IUserRepository userRepository,
IMapper mapper,
ICurrentUserService currentUserService,
ICreateUserPolicy createUserPolicy,
IModifyUserPolicy modifyUserPolicy)
{
_userRepository = userRepository;
_mapper = mapper;
_currentUserService = currentUserService;
_createUserPolicy = createUserPolicy;
_modifyUserPolicy = modifyUserPolicy;
}
public async Task CreateUserAsync(CreateUserDto createUserDto)
{
ValidationContext validationContext = new(createUserDto);
List validationResults = createUserDto.Validate(validationContext).ToList();
if (validationResults.Count > 0)
{
return Result.Failure(validationResults.Select(vr => vr.ErrorMessage!).ToList());
}
if (_currentUserService.Role is null)
{
return Result.Failure(new List { "You need to sign in." });
}
if (!_createUserPolicy.CanCreate(_currentUserService.Role.Value))
{
return Result.Failure(new List { "You don't have permission to create a user." });
}
User user = _mapper.Map(createUserDto);
if (await _userRepository.ExistsAsync(user.Sid))
{
return Result.Failure(new List { $"User with already exists." });
}
await _userRepository.AddAsync(user);
return Result.Success(user);
}
}
< /code>
и в доменном уровне у меня есть следующая политика: < /p>
namespace Domain.Policies;
public class PermissionPolicies : IPermissionPolicies
{
public bool CanCreateUsers(Role role) => role is Role.Manager;
[...]
}
< /code>
У меня есть несколько вопросов, касающихся этой реализации: < /p>
- Разделение проблем: я предположил, что аутентификация и
авторизация выполняются в службе приложения до
вызывать логику домена. Это правильный подход в DDD? < /Li>
Инварианты домена в качестве политики: приемлемо ли основывать
аутентификацию и разрешение на политике, учитывая, что «кто может выполнять
x»-это бизнес-инвариант в домене? Централизация
цели), должен ли метод, который зависит от конкретной роли, также
проверить внутренне (в пределах домена), что пользователь имеет
соответствующую роль? Другими словами, должно ли это добавить исключение, если
роль не действительна, рассматривая его как ошибку программирования? Правильно разделить эти проблемы в контексте DDD было бы очень оценено!
Подробнее здесь: https://stackoverflow.com/questions/795 ... ization-be