将活动输出旁路到交换机情况下的活动



我喜欢活动输入和输出的想法,更喜欢它们,而不是在工作流上下文中设置值。然而,我现在在使用切换案例时一直坚持这种方法。我的工作流程如下:

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>();

在没有开关的情况下,GetShopType1ProductsActivity的输入是GetShopDataActivity的输出,但使用开关的情况时,输入是null

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

编辑:我使用的是Elsa 2.0.0-preview7.1545

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

也就是说,是否使用输出/输入取决于您。

你能做的是:

  1. GetShopDataActivity指定名称(使用.WithName(。例如"GetShopDataActivity1"
  2. 直接使用GetShopDataActivity的输出作为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>();

相关内容

最新更新