Не можете использовать что-то вроде меня или этого ключевого слова в активности wf4 xaml?

Мы реализовали класс ActivityException, в котором конструктор принимает (среди прочего) аргумент типа System.Activities.Activity. Этот аргумент используется для создания сообщения об ошибке, содержащего Activity.DisplayName и Activity.Id.

Это очень хорошо работает для действий WF4, написанных на C #. Здесь я могу использовать что-то вроде:

throw new ActivityException(this, ...)

Но теперь я реализую действие WF4 в формате xaml (т.е. использую редактор рабочего процесса). Если я выброшу здесь исключение, мне придется использовать действие System.Activities.Statements.Throw. Я заполнил параметр Exception этого действия следующим образом:

new ActivityException(Me, ...)

Но редактор рабочего процесса говорит: «Я действителен только в рамках метода экземпляра».

Я также пробовал «это» вместо «Я», но это тоже вызывает сообщение об ошибке.

Есть у кого-нибудь идеи, как решить эту проблему?


person MaDev    schedule 18.11.2014    source источник


Ответы (2)


Если имя формы - MainWindow, например, вы можете сделать: MainWindow mw = new MainWindow; new ActivityException(mw, ...)

person Community    schedule 18.11.2014
comment
Но при таком подходе я бы передал ActivityException другой экземпляр действия, а не собственный экземпляр. В результате ActivityException будет читать неверный Activity.Id при создании сообщения об ошибке. - person MaDev; 18.11.2014

Даже если такая вещь в конечном итоге сработает, Me, к которому вы пытаетесь получить доступ, будет Thrown действием, а не каким-либо другим. Более того, похоже, что вы используете исключения, чтобы что-то регистрировать (?). Вы так не поступаете.

Не зная, что вы пытаетесь сделать, я бы посоветовал вам сделать шаг назад и рассмотреть другой подход. Два варианта:

1) Создайте свое собственное действие, которое получает указанное DisplayName и генерирует исключение:

public class ThrownActivityException : CodeActivity
{
    [RequiredArgument]
    public InArgument<string> ActivityDisplayName { get; set; }

    public override void Execute(CodeActivityContext context)
    {
        var displayName = ActivityDisplayName.Get(context);

        throw new ActivityException(displayName);
    }
}

2) Второй вариант и, наверное, то, что вы хотите. Учитывая, что вы пытаетесь получить доступ к информации времени выполнения (идентификатор активности) для ведения журнала, отметьте Отслеживание рабочего процесса и его возможности.

person Joao    schedule 18.11.2014
comment
›Даже если такая вещь в конечном итоге сработает, я, к которому вы пытаетесь получить доступ, будет действием Thrown, а не каким-либо другим -› вот чего я опасался :-) - person MaDev; 19.11.2014
comment
1. Создайте свое собственное действие: Хорошо, но в чем преимущество создания собственного действия по сравнению с использованием Throw действия Microsoft? В обоих случаях мне нужно реализовать новый ActivityException ctor, который принимает строку вместо действия. - person MaDev; 19.11.2014
comment
2. Используйте отслеживание рабочего процесса: мы уже используем отслеживание, но только если мы вручную активируем его у нашего клиента. Мы не используем постоянное автоматическое отслеживание (по соображениям производительности). - person MaDev; 19.11.2014
comment
Мы используем ActivityException, потому что хотим иметь дополнительную информацию в случае исключений. Добавляя Activity.Id в сообщение об исключении, мы можем различать источники ошибок в случае, если ошибочное действие появляется более одного раза в рабочем процессе. - person MaDev; 19.11.2014