2010-04-07 48 views
1

有沒有人有一個在csla中實現異步驗證規則的簡單示例?csla中的異步驗證規則

我已經看過Rolodex示例中的公司類中的示例,但這不是特別清楚:爲什麼我需要一個命令類?

我在WPF應用程序中使用csla 3.8。

回答

1

好吧,我想出瞭如何做到這一點,但最終發現答案打開了一大堆蠕蟲。

添加異步規則,業務類:

protected override void AddBusinessRules() 
{ 
    base.AddBusinessRules(); 

    ValidationRules.AddRule(UserNameIsUniqueAsync, new AsyncRuleArgs(UserRefProperty, NameProperty)); 
} 

與addrule第一個參數是如下委託:

private static void UserNameIsUniqueAsync(AsyncValidationRuleContext context) 
{ 
    DuplicateUserNameCommand command = new DuplicateUserNameCommand((int)context.PropertyValues["UserRef"], context.PropertyValues["Name"].ToString()); 
    DataPortal<DuplicateUserNameCommand> dp = new DataPortal<DuplicateUserNameCommand>(); 

    dp.ExecuteCompleted += (o, e) => 
    { 
     if (e.Error != null) 
     { 
      context.OutArgs.Description = "Error checking for duplicate user name. " + e.Error.ToString(); 
      context.OutArgs.Severity = RuleSeverity.Error; 
      context.OutArgs.Result = false; 
     } 
     else 
     { 
      if (e.Object.IsDuplicate) 
      { 
       context.OutArgs.Description = "Duplicate user name."; 
       context.OutArgs.Severity = RuleSeverity.Error; 
       context.OutArgs.Result = false; 
      } 
      else 
      { 
       context.OutArgs.Result = true; 
      } 
     } 

     context.Complete(); 
     System.Diagnostics.Debug.WriteLine("Context.Complete()"); 
    }; 
    dp.BeginExecute(command); 
} 

又委託調用DuplicateUserNameCommand這是新型你需要創建:

[Serializable] 
public class DuplicateUserNameCommand : CommandBase 
{ 
    private int _userRef; 
    private string _userName; 
    private bool _isDuplicate; 

    public DuplicateUserNameCommand(int userRef, string userName) 
    { 
     _userRef = userRef; 
     _userName = userName; 
    } 

    public bool IsDuplicate 
    { 
     get { return _isDuplicate; } 
     private set { _isDuplicate = value; } 
    } 


    protected override void DataPortal_Execute() 
    { 
     // Check for an existing user in the database with the same username 
     var repository = new NHibernateUserDAORepository(); 
     var existingUser = repository.FindByUserName(_userName); 

     if (existingUser != null && existingUser.UserRef != _userRef) 
     { 
      _isDuplicate = true; 
     } 
     else 
     { 
      _isDuplicate = false; 
     } 
    } 
} 

就是這樣。我遇到的問題是,Command的DataPortal_Execute中的所有代碼都必須是線程安全的。在我的情況下,這導致了severak問題,所以現在我恢復到同步規則。