2013-03-29 3 views
3

Я создал конечный автомат рабочего процесса Windows, который имеет пользовательские действия (CodeActivity). Эти пользовательские действия должны иметь доступ к базе данных, и у меня есть свойство, которое содержит соединение с базой данных.Пользовательские действия рабочего процесса Windows, которые получают доступ к базе данных, их повторное использование и состояние

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

Например, давайте предположим, что моя деятельность называется DoSomething и выглядит следующим образом:

public class DoSomething : CodeActivity 
{ 
    protected DbContext DbContext { get; set; } 

    protected override void Execute(CodeActivityContext context) 
    { 
     using (this.DbContext = CreateMyDatabaseContext()) 
     { 
      DoSomething(this.DbContext); 
     } 
    } 

} 

Если два экземпляра рабочего процесса Invoke DoSomething(), в то же время, то (поскольку тот же экземпляр DoSomething используется), они будут указывать на тот же контекст базы данных.

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

Если это невозможно, я понимаю, что мне нужно будет удалить любые свойства экземпляра из этой активности, и это приемлемый ответ.

Но мне интересно, есть ли другой механизм, в котором я могу иметь свойства экземпляра. Например, существует ли свойство рабочего процесса, которое определяет, как создаются объекты активности (например, отдельный экземпляр для каждого рабочего процесса)? Или что-то типа того?

Спасибо за вашу помощь, Эрик

ответ

2

Варианты использования одного или нескольких экземпляров рабочих процессов зависит от того, как вы размещаете и инициализировать рабочие процессы?

Тем не менее использование не должно инициализировать свойство. Использование выражения ограничивает жизнь переменной этим блоком только тогда, когда свойство можно использовать везде.

В общем, для Workflows я бы никогда не использовал объекты, не связанные с потоком, в качестве свойств Activity. Особенно, если экземпляр этого объекта привязан для конкретного запроса. Лучшим подходом было бы инициализировать объект в одном действии (который может быть спроектирован так, чтобы быть очень гибким и мощным), добавить его в текущий ActivityContext и использовать его оттуда в следующих действиях.

+0

Я пришел к такому же выводу - что активность не должен использовать не поточно-объекты. Спасибо за ваш комментарий. – Eric

0

Вы можете использовать тип Variable<T> для состояния экземпляра рабочего процесса.

Кроме того, следующие типы используются для текущих данных в и из экземпляров рабочих процессов:

InArgument<T> 
OutArgument<T> 
InOutArgument<T> 

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

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