5

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."
           }
       }
}

皆さん、これは良い考えだと思いますか?

4

2 に答える 2

2

それは十分ですが、私があなただったら、私は使用します

...
private readonly Func<IUserRepository> userRepositoryFactory;
...
public IEnumerable<ValidationResult> Validate()  
   {  
       UserCriteria criteria = new UserCriteria { UserName = this.UserName };  
       using(var UserRepository = userRepositoryFactory())
       {
           IList<User> users = UserRepository.SearchUsers(criteria);  

           if (users != null && users.count() > 0)  
           {  
               yield return new ValidationResult("User with username " + this.UserName + " already exists."  
           }  
       }
   }
于 2012-09-28T18:54:15.587 に答える
0

ドメインサービスクラスを追加して、オブジェクトを条件に一致させ、ドメインサービスレベルで検証することができます

 public class PurchaseOrder
    {
        public string Id { get; private set; }
        public string PONumber { get; private set; }
        public string Description { get; private set; }
        public decimal Total { get; private set; }
        public DateTime SubmissionDate { get; private set; }
        public ICollection<Invoice> Invoices { get; private set; }

        public decimal InvoiceTotal
        {
            get { return this.Invoices.Select(x => x.Amount).Sum(); }
        }

    }

    public class PurchaseOrderService
    {
        public PurchaseOrderService(IPurchaseOrderRepository repository)
        {
            this.repository = repository;
        }

        readonly IPurchaseOrderRepository repository;

        public void CheckPurchasedOrderExsist(string purchaseOrderId)
        {
                var purchaseOrder = this.repository.Get(purchaseOrderId);
                if (purchaseOrder != null)
                    throw new Exception("PO already exist!");
        }
    }
于 2012-09-28T19:25:29.637 に答える