gpt4 book ai didi

validation - DDD - 实体的存储库相关验证

转载 作者:行者123 更新时间:2023-12-04 14:34:10 33 4
gpt4 key购买 nike

我很难找出实现依赖于数据库中存储的数据的业务规则验证的最佳方法。在下面的简化示例中,我想确保用户名属性是唯一的。

public class User() {
public int Id { get; set; }
public string Name { get; set; }
public string Username { get; set; }
public string Password { get; set; }
public string GenerateRandomPassword() {

}
}

public interface IUserRepository : IRepository<User>
{
bool UsernameTaken(string username);
}

public interface IUnitOfWork : IDisposable
{
void Commit();
IUserRepository Users { get; }
}

我已经阅读了很多关于实现这一目标的不同方法的资料,包括将存储库注入(inject)实体(并防止它进入无效状态)、创建扩展方法等。

但是我认为这些都不是最好的方法。

所以我决定使用应用程序服务来编排使用规范的实体验证。

public class CreateUserService : ICreateUserService
{
private readonly IUnitOfWork _uow;

public CreateUserService(IUnitOfWork uow)
{
_uow = uow;
}

public User Create(User user)
{
var usernameAvailableSpecification = new UsernameAvailableSpecification(_uow.Users);

if (!usernameAvailableSpecification.IsSatisfiedBy(user))
{
throw new ValidationException("Username already taken");
}

user.GenerateRandomPassword();

_uow.Users.Store(user);
_uow.Commit();

return user;
}
}

起初,它看起来不错。但是单元测试有点困难,因为服务与规范实现紧密耦合,它必须手动处理规范的依赖关系。我也考虑过抽象规范,但我不确定我的道路是否正确。

也有可能我一开始就错了,因为实际上我正在学习 DDD,但我仍然不清楚哪一层应该负责这种验证。

如有任何帮助,我们将不胜感激。

最佳答案

这几乎就是我对其建模的方式,只是我会将 CreateUserService 设为域服务(并在单独的应用程序服务中处理工作单元)。使用这种方法,我不会太害怕领域服务和规范之间的紧密耦合,因为用户名唯一性似乎是起源于实际业务领域的业务规则(这里是“用户和身份验证”限界上下文) .

如果您仍然害怕CreateUserService 与规范之间的紧耦合,您确实可以进一步抽象规范。似乎是合法的,但请记住 YAGNI 原则。

关于validation - DDD - 实体的存储库相关验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25572241/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com