Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#如何使用谓词和动作委托构建逻辑工作流?_C#_Design Patterns_Specification Pattern - Fatal编程技术网

C#如何使用谓词和动作委托构建逻辑工作流?

C#如何使用谓词和动作委托构建逻辑工作流?,c#,design-patterns,specification-pattern,C#,Design Patterns,Specification Pattern,是否有一种设计模式可以应用于构建复杂的工作流,而无需编写多个条件语句和嵌套条件语句?我认为答案可能在于使用类似于规范模式的东西,但我不确定它是如何在C#中结合在一起的 您可以将条件定义为枚举(或结构具有更大的可扩展性): 然后使用一个方法定义工作流项,例如ShouldExecute,该方法接受标志并返回true/false,如果该项应该运行 public class MyWorkflowItem : IWorkflowItem { public bool ShouldExecute(Wo

是否有一种设计模式可以应用于构建复杂的工作流,而无需编写多个条件语句和嵌套条件语句?我认为答案可能在于使用类似于规范模式的东西,但我不确定它是如何在C#中结合在一起的


您可以将条件定义为
枚举
(或
结构
具有更大的可扩展性):

然后使用一个方法定义工作流项,例如
ShouldExecute
,该方法接受标志并返回
true
/
false
,如果该项应该运行

public class MyWorkflowItem : IWorkflowItem
{
    public bool ShouldExecute(WorkflowFlags flags) 
    {
        return (flags & WorkflowFlags.Retry) != 0;
    } 
} 

您可以将条件定义为
枚举
(或
结构
具有更大的可扩展性):

然后使用一个方法定义工作流项,例如
ShouldExecute
,该方法接受标志并返回
true
/
false
,如果该项应该运行

public class MyWorkflowItem : IWorkflowItem
{
    public bool ShouldExecute(WorkflowFlags flags) 
    {
        return (flags & WorkflowFlags.Retry) != 0;
    } 
} 

您可能可以使用规范模式对逻辑进行编码 这里有一个c#示例说明如何做到这一点

你可能在网上找到了很多例子

由于您的解释,我无法理解您为什么要使用规范模式来编写逻辑代码

在某一点上,您被迫使用条件语句

然而,看起来你可能想要这样的东西

public static void Reaction(this Func<bool> condition, Action conditionMet,Action conditionUnmet)
{
    condition() ? conditionMet() : conditionUnmet();
}
公共静态无效反应(此函数条件、动作条件满足、动作条件未满足)
{
条件()?条件满足():条件未满足();
}
使用它的方法如下

Func<bool> CanDoAction = ()=> false;
Action behaviorAction = ()=> DoStuff;
Action behaviorUnableToDoAction = ()=> DoOtherStuff;

CanDoAction.Reaction(behaviorAction ,behaviorUnableToDoAction );
Func-CanDoAction=()=>false;
动作行为动作=()=>DoStuff;
Action Behavior UnableToDoAction=()=>DoOtherStuff;
CanDoAction.反应(behaviorAction,BehaviorUnabledoAction);

您可能可以使用规范模式对逻辑进行编码 这里有一个c#示例说明如何做到这一点

你可能在网上找到了很多例子

由于您的解释,我无法理解您为什么要使用规范模式来编写逻辑代码

在某一点上,您被迫使用条件语句

然而,看起来你可能想要这样的东西

public static void Reaction(this Func<bool> condition, Action conditionMet,Action conditionUnmet)
{
    condition() ? conditionMet() : conditionUnmet();
}
公共静态无效反应(此函数条件、动作条件满足、动作条件未满足)
{
条件()?条件满足():条件未满足();
}
使用它的方法如下

Func<bool> CanDoAction = ()=> false;
Action behaviorAction = ()=> DoStuff;
Action behaviorUnableToDoAction = ()=> DoOtherStuff;

CanDoAction.Reaction(behaviorAction ,behaviorUnableToDoAction );
Func-CanDoAction=()=>false;
动作行为动作=()=>DoStuff;
Action Behavior UnableToDoAction=()=>DoOtherStuff;
CanDoAction.反应(behaviorAction,BehaviorUnabledoAction);

老实说,我认为你找错人了。您可以将条件组合成单个规范来封装它们,也可以为不同的条件创建不同的规范来命名它们,但我认为其他模式更合适——如果我正确推断您的需要的话


您希望实现“复杂的工作流”。对我来说,这意味着您希望实现具有许多分支点的业务用例。对于这些人来说,某种形式的培训是最好的开始

老实说,我认为你找错人了。您可以将条件组合成单个规范来封装它们,也可以为不同的条件创建不同的规范来命名它们,但我认为其他模式更合适——如果我正确推断您的需要的话


您希望实现“复杂的工作流”。对我来说,这意味着您希望实现具有许多分支点的业务用例。对于这些人来说,某种形式的培训是最好的开始

即使我发现在你的例子中使用条件语句是可以的,但是,你可以看看a可以解决这个问题即使我发现在你的例子中使用条件语句是可以的,但是,你可以看看a可以解决这个问题