【问题标题】:Custom windows workflow activities which access the database, reuse and state访问数据库、重用和状态的自定义 Windows 工作流活动
【发布时间】:2013-03-29 21:58:13
【问题描述】:

我创建了一个具有自定义活动 (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 实例),它们将指向同一个数据库上下文。

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

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

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

感谢您的帮助, 埃里克

【问题讨论】:

    标签: workflow-foundation-4 workflow-activity


    【解决方案1】:

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

    尽管如此,使用不应该初始化属性。 using 语句将变量的寿命限制在该块中,而属性可以在任何地方使用。

    一般来说,对于工作流,我永远不会使用非线程安全对象作为 Activity 的属性。特别是如果该对象的实例绑定到特定请求。更好的方法是在一个活动中初始化对象(可以设计为非常灵活和强大),将其添加到当前的 ActivityContext 并从那里在下一个活动中使用它。

    【讨论】:

    • 我得出了同样的结论——Activity 不应该使用非线程安全的对象。感谢您的评论。
    【解决方案2】:

    您可以将Variable<T> 类型用于工作流实例状态。

    此外,以下类型用于流入和流出工作流实例的数据:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-22
      • 2016-04-25
      相关资源
      最近更新 更多