我正试图在ASP.NET MVC 3中构建一个应用,它结合了领域驱动设计和测试驱动开发。我的架构设置包括Repositories, Domain Models, View Models, Controllers和Views。所有验证都将在视图模型中处理。我设置了视图模型继承"IValidatableObject",以便在控制器方法调用"ModelState.IsValid"时执行我的验证属性和自定义验证,我设置的"Validate"方法也被执行。我遇到的问题是,在视图模型的验证方法中访问我的Repository。我需要访问Repository来检查数据库中是否有重复的记录。最好的想法似乎是创建一个IRepository类型的属性,并通过将我的Repository注入到视图模型的构造函数中来设置该属性。例如:
public class UserViewModel : IValidatableObject
{
public UserViewModel(User user, IUserRepository userRepository)
{
FirstName = user.FirstName;
LastName = user.LastName;
UserRepository = userRepository;
UserName = user.UserName;
}
public string UserName { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public IUserRepository UserRepository { get; set; }
public IEnumerable<ValidationResult> Validate()
{
UserCriteria criteria = new UserCriteria { UserName = this.UserName };
IList<User> users = UserRepository.SearchUsers(criteria);
if (users != null && users.count() > 0)
{
yield return new ValidationResult("User with username " + this.UserName + " already exists."
}
}
}
你们认为这是一个好主意吗?