1

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

   static void Main()
    {
        // I have some predicates
        bool transientError = true;
        bool fatalError = true;
        bool maxRetriesReached = true;

        // I have some actions
        Action SendToDeadletter = () => { };
        Action Retry = () => { };
        Action Complete = () => { };

        // Is there a way of building the following without using conditional statements
        // something like Specification Pattern?

        // maxRetriesReached || fatalError => SendToDeadletter()
        // transientError && !maxRetriesReached => Retry()
        // !transientError && !fatalError => Complete()

    }
4

3 回答 3

0

您可能可以使用规范模式来编码您的逻辑有 ac# example on how to do this here

https://en.wikipedia.org/wiki/Specification_pattern

您可能在网上找到了很多示例。

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

有时你不得不使用条件语句。

看起来你可能想要这样的东西。

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 );
于 2017-11-23T20:25:41.877 回答
0

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

您想要实施“复杂的工作流程”。对我来说,这就是说你想要实现有很多分支点的业务用例。对于那些人来说,某种形式的策略模式是最好的起点。

于 2018-11-21T17:28:04.273 回答
0

您可以将条件定义为enum(或struct具有更多可扩展性):

[Flags] 
public enum WorkflowFlags
{
    SendToDeadletter, 
    Retry, 
    Continue 
} 

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

public class MyWorkflowItem : IWorkflowItem
{
    public bool ShouldExecute(WorkflowFlags flags) 
    {
        return (flags & WorkflowFlags.Retry) != 0;
    } 
} 
于 2017-11-23T20:15:02.853 回答