Правило асинхронной проверки в csla - PullRequest
1 голос
/ 08 апреля 2010

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

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

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

1 Ответ

1 голос
/ 08 апреля 2010

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

Добавление правила асинхронности в ваш бизнес-класс:

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 команды должен быть потокобезопасным.В моем случае это вызвало проблемы серак, поэтому сейчас я возвращаюсь к синхронным правилам.

...