2

我正在尝试使用 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 并使我的用户实体与我的用户存储库分离的任何想法?

4

1 回答 1

2

DDD 建议您可能有一个域服务来从域验证中抽象用户存储库(不变强制)。

我想知道上面示例中的代码驻留在哪里(验证服务)?但我建议你确保它在域中。这是一种将复杂验证附加到仍支持该接口的实体的巧妙方法。IDataErrorInfo

我建议的是在您的验证方法中返回您的Users.Exists查询的域服务。就像是:

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

在上面的示例中,我将使用 DI 将适当的依赖项注入到UserServicerepo/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));
                }
        });

注意:上述方法要求将validator属性设置false为指示无效状态(以防不明确)。

于 2009-12-12T06:44:32.233 回答