代码之家  ›  专栏  ›  技术社区  ›  DM.

如何验证需要访问XVAL中存储库的属性?

  •  2
  • DM.  · 技术社区  · 15 年前

    我正在尝试使用XVAL验证新用户的注册。当我试图实现检查新用户试图注册的用户名是否已经被占用的逻辑时,我遇到了一个蜂鸣锯。如果我的用户实体不依赖于我的用户,我似乎就找不到一种方法来实现这一点。以下是我需要找到在我的用户实体中实现的方法:

    public IEnumerable<ErrorInfo> ValidateUniqueUserName(string username)
    {
        if(usersRepository.Users.Exists(m => (m.UserName == username)))
            yield return new ErrorInfo("UserName", "User name already exists");
    }
    

    关于如何继续在这个场景中使用XVAL并保持我的用户实体与我的用户实体的分离,有什么想法吗?

    1 回复  |  直到 15 年前
        1
  •  2
  •   Community Bayu Bramantya    7 年前

    DDD建议您可以使用域服务从域验证(不变强制)中抽象用户repo。

    我想知道上面例子中的代码在哪里(验证服务)?但我建议你确保它在这个领域。 Here is a clever way 将复杂的验证附加到仍然支持 IDataErrorInfo 接口。

    我建议您在验证方法中使用一个域服务,它将返回 Users.Exists 查询。类似:

            base.AddRule(new ValidationRule()
            {
                Properties = "username",
                Description = "User name already exists",
                validator = () => !(new UserService()).Users.Exists(m => (m.UserName == username))
            });
    

    在上面的示例中,我将使用DI向 UserService 用于访问repo/数据,但如果您愿意,可以使用工厂或手动DI对象创建方法:

            base.AddRule(new ValidationRule()
            {
                Properties = "username",
                Description = "User name already exists",
                validator = () =>
                    {
                        UserService us = ObjectFactory.GetInstance<UserService>();
                        return !us.Users.Exists(m => (m.UserName == username));
                    }
            });
    

    注: above method 需要 validator 要设置为的属性 false 指示无效状态(如果不清楚)。