Я новичок в DDD и сейчас занимаюсь регистрацией пользователей.
В основном поток:
- Контроллер получает запрос
- Сопоставляет полученные данные от клиента с моделью пользовательского домена.
- Сопоставляет модель пользовательского домена с моделью сущности EF-core.
- Добавляет пользователя в базу данных с помощью EF-Core.
У меня есть некоторые сомнения относительно того, где разместить класс IdGeneratorService
и класс BCryptService
. В настоящее время оба они имеют интерфейс на уровне домена: src/Domain/Model/Services
. Их реализация находится внутри моего уровня инфраструктуры: src/Infrastructure/Services
. Оба они также вызываются внутри модели домена пользователя:
public class User
{
private User(
long id,
string name,
string lastName,
string contactPhone,
string contactEmail,
string userName,
string password)
{
Id = id;
Name = name;
LastName = lastName;
ContactPhone = contactPhone;
ContactEmail = contactEmail;
UserName = userName;
Password = password;
}
public IEnumerable<Role> Type { get; set; }
public static async Task<User> ConstructAsync(
string name, string lastName,
string contactPhone, string contactEmail,
string userName, string password,
IIdGeneratorService<long> idGeneratorService, IBCryptService bCryptService)
{
var id = await idGeneratorService.GenerateAsync();
password = bCryptService.HashPassword(password);
return new User(id, name, lastName, contactPhone, contactEmail, userName, password);
}
Это вызывается моим контроллером:
[HttpPost("[Action]")]
public async Task<IActionResult> Create([FromBody] UserModel userModel)
{
var user =
await DomainUser.ConstructAsync(
userModel.Name, userModel.LastName,
userModel.ContactPhone, userModel.ContactEmail,
userModel.UserName, userModel.Password,
_idGeneratorService, _bCryptService);
await _userRepository.AddAsync(user);
return sampleResponse;
}
Я чувствую, что вызов IdGenerator и BCrypt внутри модели домена - плохая практика, потому что, насколько я понимаю, уровень домена не может знать об уровне инфраструктуры, поэтому я не совсем уверен, как мне это сделать. Любая другая помощь/предложения относительно других реализаций, основанных на том, что вы здесь поняли, приветствуется.