我正在尝试使用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分离的任何想法?
答案 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
以指示无效状态(如果不清楚)。