【问题标题】:How do I validate a property that needs to access a repository in xVal?如何验证需要访问 xVal 中的存储库的属性?
【发布时间】:2009-12-12 04:47:04
【问题描述】:

我正在尝试使用 xVal 来验证新用户的注册。在尝试实现检查新用户尝试注册的用户名是否已被占用的逻辑时,我遇到了一个嗡嗡声。如果我的用户实体不依赖于我的 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 分离的任何想法?

【问题讨论】:

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


    【解决方案1】:

    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 以指示无效状态(以防不明确)。

    【讨论】:

    • 是的,我想我需要做一些研究并在这里实现一个纯 DDD 方法。我不确定您是否熟悉 xVal,但根据 xVal 示例,上述代码实际上位于 User 类中。我曾考虑将验证功能移至存储库(没有服务层),但随后我的存储库变得非常复杂。听起来我需要一个好的服务层,但我不知道从哪里开始
    • 我应该清楚:我在我的 asp.net-mvc 项目中也使用了 xVal,但只是为IDataErrorInfo 接口所需的索引器返回错误。我会假设你做同样的事情。在上面的示例中,我已经消除了对 xVal 库的需要,因为我自己的代码本身会返回错误。研究上面链接的 SO 问题。我的验证代码也存在于实体类中(我应该相信它,而不是服务)。
    • 看问题是,当我发现我使用的 xVal 代码有多么少时,我意识到我不需要它。我认为我使用的唯一代码是ErrorInfo 类,我看到你也使用它。您需要做的就是让您的实体类正确实现IDataErrorInfo,MVC 将了解如何验证。这真的很容易。我的代码示例展示了如何 - stackoverflow.com/questions/1721327/…
    • 非常透彻和启发性。我真正喜欢 xVal 的一件事是客户端包含 jQuery Validate。这很难包含在您的实施中吗?
    • 如果我没记错的话,jQuery 客户端验证直接挂钩到IDataErrorInfo 接口。因此,鉴于它受到支持,您应该没有问题。
    猜你喜欢
    • 2013-09-27
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    • 2019-09-08
    • 2011-04-08
    相关资源
    最近更新 更多