2009-12-12 40 views
2

我正在尝试使用xVal来验证新用户的注册。当试图实现检查新用户正在尝试注册的用户名是否已被使用的逻辑时,我遇到了一个嗡嗡声。我似乎无法找到一种方法来实现这一点,而不会让我的User实体依赖于我的UsersRepository。这是我需要找到一种方法,在我的用户实体来实现方法:如何验证需要访问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这个场景,让我的用户实体从我UsersRepository脱钩任何想法?

回答

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用于访问回购/数据,但是,如果你喜欢你可以使用一个工厂或手动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表示一个无效的状态(如果说不清楚)。

+0

是的,我想我需要做一些研究并在这里实现一个纯粹的DDD方法。我不确定您是否熟悉xVal,但根据xVal示例,上述代码实际上驻留在User类中。我想过将验证功能移到存储库(没有服务层),但是我的存储库变得非常复杂。这听起来像我需要一个良好的服务层,但我不知道从哪里开始 – 2009-12-13 03:57:57

+0

我应该清楚:我也在我的asp.net-mvc项目中使用xVal,但只是为了'IDataErrorInfo'所需的索引器返回错误接口。我会假设你做同样的事情。用我上面的例子,我已经删除了对xVal库的需求,因为我自己的代码本身返回错误。研究上面链接的SO问题。我的验证码也存在于实体类中(我应该相信它,而不是服务中)。 – 2009-12-13 05:18:08

+0

看到的是,当我发现我使用的xVal代码有多少时,我意识到我并不需要它。我使用的唯一代码是我认为你使用的'ErrorInfo'类。所有你需要做的就是让你的实体类正确地实现'IDataErrorInfo',MVC将会理解如何验证。这真的很容易。我的代码示例显示如何 - http://stackoverflow.com/questions/1721327/validate-object-based-on-external-factors-ie-data-store-uniqueness/1741831#1741831 – 2009-12-13 05:21:28