2010-04-07 7 views
1

Есть ли у кого-нибудь простой пример реализации правила проверки async в csla?Правило проверки async в csla

Я рассмотрел пример в классе компании в примере Rolodex, но это мне не очень понятно: зачем мне командный класс?

Я использую csla 3.8 в приложении WPF.

ответ

1

OK Я понял, как это сделать, но в итоге оказалось, что ответ открыл довольно большую банку червей.

Добавление правила Async к вашему бизнес-класса:

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; 
     } 
    } 
} 

Это около того. Проблема, с которой я столкнулся, заключается в том, что весь код в DataPortal_Execute Command должен быть потокобезопасным. В моем случае это вызвало проблемы Severak, поэтому пока я возвращаюсь к синхронным правилам.

 Смежные вопросы

  • Нет связанных вопросов^_^