簡體   English   中英

C#如何使用謂詞和動作委托構建邏輯工作流?

[英]C# how to build logical workflow using predicates and action delegates?

有沒有一種設計模式可用於構建復雜的工作流而無需編寫多個條件和嵌套條件語句的設計模式-我認為答案可能在於采用規范模式之類的東西,但不確定它在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()

    }

您可以將條件定義為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;
    } 
} 

您可能可以使用規范模式來編碼邏輯。這里有一個ac#示例,說明如何執行此操作

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

老實說,我認為您是在樹錯樹皮。 您可以將條件組合成一個規范來封裝它們,也可以為不同的條件創建不同的規范來命名它們,但是我認為其他模式更合適-如果我正確地推斷出您的需求。

您要實現“復雜的工作流程”。 對我來說,這就是說您要實現具有很多分支點的業務用例。 對於那些人來說,某種形式的戰略模式是最好的起點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM