3

我创建了一个具有自定义活动 (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);
        }
    }

}

如果工作流的两个实例同时调用 DoSomething(),那么(因为正在使用同一个 DoSomething 实例),它们将指向同一个数据库上下文。

但相反,我想要的是让活动的每次调用都使用一个新的活动实例。

如果这是不可能的,那么我知道我需要从活动中删除任何实例属性,这是一个可以接受的答案。

但我想知道是否可以使用另一种机制来拥有实例属性。例如,工作流上是否有一个属性决定如何创建活动对象(例如,每个工作流的单独实例)?或类似的东西?

谢谢你的帮助,埃里克

4

2 回答 2

2

使用单个或多个工作流实例的选项取决于您如何托管和初始化工作流?

Nonetheless using should not initialize property. Using statement limits life of variable to that block only while property can be used from everywhere.

In general, for Workflows, I would never use non thread-safe objects as properties for Activity. Especially if instance of that object is bound for specific request. Better approach would be to initialize object in one activity (which can be designed to be very flexible and powerful), add it to current ActivityContext and use it from there in next activities.

于 2013-04-02T22:38:47.590 回答
0

You can use the Variable<T> type for workflow instance state.

In addition the following types are used for flowing data in and out of workflow instances:

InArgument<T>
OutArgument<T>
InOutArgument<T>
于 2013-07-26T20:20:12.030 回答