gpt4 book ai didi

validation - DDD 实体验证

转载 作者:行者123 更新时间:2023-12-02 18:48:05 25 4
gpt4 key购买 nike

我有一个与实体验证相关的问题。例如,有一个用户,可以在给定电子邮件密码的系统中注册。业务规则规定:

  1. 电子邮件必须有效(必须符合电子邮件格式)且唯一;
  2. 密码应介于 6 到 20 个字符之间。

我最初的想法是将验证放在User.Register(电子邮件,密码)内。这种方法的主要优点是User通过验证注册数据的正确性来控制其注册方式。缺点是电子邮件唯一性验证需要调用 UserRepository,因此 User 可能依赖于其 Repository。为了解决此问题,电子邮件和密码验证可能会分解为某种 BusinessRule 对象。因此 User.Register() 方法中的验证可能如下所示:

var emailValidationErrors = _emailRule.Validate(email);
var passwordValidationErrors = _passwordRule.Validate(password);

其中 _emailRule_passwordRule 可以作为构造函数参数传递:User(EmailRule emailRule, PasswordRule passwordRule)。

在这种情况下,User 未直接耦合到 UserRepository。这样,规则就明确地显示在域中,从而使其更具表现力。

所以问题是:您对这种方法有何看法?还有其他解决办法吗?

最佳答案

您可以实现封装此内容的域服务。通常,在 DDD 中,当业务逻辑超出单个聚合的范围时,您将使用域服务;在这种情况下,它是唯一性检查。所以,我要做的是:

public class UserRegistrationService : IUserRegistrationService
{
private readonly IUserRespository _userRepository;

public void Register(string email, string password)
{
if (!_userRepository.DoesEmailExist(email))
throw new Exception("Email already registered");

User user = User.Create(email, password);

_userRepository.Save(user);
}
}

此外,如果您担心 User.Create 在注册服务之外被调用,从而逃避唯一性检查,您可以将 User.Create 方法设置为内部,这意味着创建用户的唯一方法是通过注册服务。

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

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