ASP.NET MVC 3 で構築しているこのアプリケーションに、ドメイン駆動設計とテスト駆動開発を組み合わせて使用しようとしています。私のアーキテクチャは、リポジトリ、ドメイン モデル、ビュー モデル、コントローラー、およびビューでセットアップされています。すべての検証はビュー モデルで処理されます。ビューモデルを「IValidatableObject」から継承するように設定して、コントローラーメソッドが「ModelState.IsValid」を呼び出したときに、検証属性と「Validate」メソッドで設定したカスタム検証の両方が実行されるようにしました。私が直面している問題は、ビュー モデルの Validate メソッドでリポジトリにアクセスすることです。データベース内の重複レコードを確認するには、リポジトリにアクセスする必要があります。IRepository タイプのプロパティを作成し、リポジトリをビュー モデルのコンストラクタに注入してそのプロパティを設定するのが最善の方法のようです。例えば:
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."
}
}
}
皆さん、これは良い考えだと思いますか?