0

我喜欢活动输入和输出的想法,并且比在工作流上下文中设置值更喜欢它们。但是,我现在在使用 switch 案例时坚持使用这种方法。我的工作流程如下所示:

builder
  .ReceiveHttpPostRequest<ImportProducts>("/import")
  .Then<ExtractHttpRequestBodyActivity>()
  .Then<GetShopDataActivity>()
  .Switch(cases => cases
    .Add(
      context => context.GetInput<ShopData>()!.ShopType == "ShopType1",
      @case => @case
        .Then<GetShopType1ProductsActivity>()
        .Then<FilterShopType1ProductsActivity>()
        .Then<ConvertShopType1ProductsActivity>()))
  .Then<DebugActivity>();

没有 switch case 的输入GetShopType1ProductsActivity是 的输出GetShopDataActivity,但是使用 switch case 的输入是null

有没有办法绕过案例的第一个活动的输出?

编辑:我正在使用 Elsa 2.0.0-preview7.1545

4

1 回答 1

1

无法绕过 Elsa 表单将活动输出自动发送到另一个活动作为输入。

话虽如此,是否使用 output/input 取决于您

你可以做的是:

  1. 为(使用)指定名称。例如GetShopDataActivity.WithName"GetShopDataActivity1"
  2. 使用GetShopDataActivity Directly的输出作为 的输入GetShopType1ProductsActivity

要使用命名活动的输出,请使用以下代码:

context.GetOutputFrom<ShopData>("GetShopDataActivity1");

另一种方法是将输出存储GetShopDataActivity在一个变量中,然后您可以使用其他活动的该变量。

提示:在开发自定义活动时,请尝试公开其输入。例如,如果GetShopType1ProductsActivity需要来自 的输出GetShopDataActivity,而不是直接从该活动中的活动上下文读取输入,请考虑使用“输入”属性公开必要的数据,如下所示:

[ActivityInput] public ShopData ShopData { get; set; }

然后您可以按如下方式更新您的工作流程:

builder
  .ReceiveHttpPostRequest<ImportProducts>("/import")
  .Then<ExtractHttpRequestBodyActivity>()
  .Then<GetShopDataActivity>().WithName("GetShopDataActivity1")
  .Switch(cases => cases
    .Add(
      context => context.GetInput<ShopData>()!.ShopType == "ShopType1",
      @case => @case
        .Then<GetShopType1ProductsActivity>(a => a.Set(x => x.ShopData, context => context.GetOutputFrom<ShopData>(""GetShopDataActivity1)))
        .Then<FilterShopType1ProductsActivity>()
        .Then<ConvertShopType1ProductsActivity>()))
  .Then<DebugActivity>();

这可以通过在您的类上添加几个扩展方法来稍微清理一下GetShopType1ProductsActivity(更具体地说,在ISetupActivity<GetShopType1ProductsActivity>称为例如WithShopData.

此外,如果您需要来自GetShopDataActivity多个地方的输出(就像您已经在至少两个地方一样),请考虑创建一个提供此信息的扩展方法。

例如:

public static class ShoppingWorkflowExtensions
{
   public static ShopData GetShopData(this ActivityExecutionContext context) => context => context.GetOutputFrom<ShopData>(""GetShopDataActivity1)!; 
}

然后,您可以像这样更新您的工作流程:

builder
  .ReceiveHttpPostRequest<ImportProducts>("/import")
  .Then<ExtractHttpRequestBodyActivity>()
  .Then<GetShopDataActivity>().WithName("GetShopDataActivity1")
  .Switch(cases => cases
    .Add(
      context => context.GetShopData().ShopType == "ShopType1",
      @case => @case
        .Then<GetShopType1ProductsActivity>(x => x.WithShopData(context => context.GetShopData()))
        .Then<FilterShopType1ProductsActivity>()
        .Then<ConvertShopType1ProductsActivity>()))
  .Then<DebugActivity>();
于 2021-06-06T12:14:37.967 回答