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

时间:2009-12-12 04:47:05

标签: asp.net-mvc validation data-annotations xval

我正在尝试使用xVal来验证新用户的注册。在尝试实现检查新用户尝试注册的用户名是否已被占用的逻辑时,我遇到了嗡嗡声。如果没有我的User实体依赖于我的UsersRepository,我似乎无法找到实现这一目标的方法。这是我需要找到在我的用户实体中实现的方法的方法:

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

关于如何继续在这种情况下使用xVal并让我的用户实体与我的UsersRepository分离的任何想法?

1 个答案:

答案 0 :(得分:2)

DDD会建议您使用域服务从域验证中抽象出用户仓库(不变强制执行)。

我想知道上面示例中的代码所在的位置(验证服务)?但我建议你确保它在域中。 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 / data,但如果您愿意,可以使用工厂或手动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以指示无效状态(如果不清楚)。