2009-12-12 106 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