在开关盒中将 activity 输出旁路到 activity
Bypass activity output to activity in switch case
我喜欢 activity 输入和输出的想法,并且更喜欢它们而不是在工作流上下文中设置值。但是,我现在在使用 switch cases 时坚持使用这种方法。我的工作流程如下所示:
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
.
有没有办法绕过输出到案例的第一个 activity?
编辑: 我正在使用 Elsa 2.0.0-preview7.1545
无法绕过 Elsa 表单自动发送 activity 输出到另一个 activity 作为输入。
也就是说,是否使用 output/input 取决于您。
你能做的是:
- 为
GetShopDataActivity
指定一个名称(使用.WithName
)。例如。 "GetShopDataActivity1"
- 使用
GetShopDataActivity
的输出直接作为GetShopType1ProductsActivity
的输入。
要使用命名 activity 的输出,请使用以下代码:
context.GetOutputFrom<ShopData>("GetShopDataActivity1");
另一种方法是将 GetShopDataActivity
的输出存储在一个变量中,然后您可以在其他活动中使用该变量。
提示:在开发自定义活动时,尽量公开他们的输入。例如,如果 GetShopType1ProductsActivity
需要来自 GetShopDataActivity
的输出,而不是直接从 activity 上下文中的 activity 读取输入,请考虑使用“输入”公开必要的数据" 属性,像这样:
[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
class 上添加几个扩展方法(更具体地说,在 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>();
我喜欢 activity 输入和输出的想法,并且更喜欢它们而不是在工作流上下文中设置值。但是,我现在在使用 switch cases 时坚持使用这种方法。我的工作流程如下所示:
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
.
有没有办法绕过输出到案例的第一个 activity?
编辑: 我正在使用 Elsa 2.0.0-preview7.1545
无法绕过 Elsa 表单自动发送 activity 输出到另一个 activity 作为输入。
也就是说,是否使用 output/input 取决于您。
你能做的是:
- 为
GetShopDataActivity
指定一个名称(使用.WithName
)。例如。"GetShopDataActivity1"
- 使用
GetShopDataActivity
的输出直接作为GetShopType1ProductsActivity
的输入。
要使用命名 activity 的输出,请使用以下代码:
context.GetOutputFrom<ShopData>("GetShopDataActivity1");
另一种方法是将 GetShopDataActivity
的输出存储在一个变量中,然后您可以在其他活动中使用该变量。
提示:在开发自定义活动时,尽量公开他们的输入。例如,如果 GetShopType1ProductsActivity
需要来自 GetShopDataActivity
的输出,而不是直接从 activity 上下文中的 activity 读取输入,请考虑使用“输入”公开必要的数据" 属性,像这样:
[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
class 上添加几个扩展方法(更具体地说,在 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>();