賞金將在 4 天后到期。此問題的答案有資格獲得 100聲望賞金。 Rocky Balboa希望引起更多關注這個問題:
只是想知道人們在這里的想法
我有一個相當簡單的應用程式,其中我需要一些簡化版本的 saga 模式。這是一個整體型別的應用程式,我只需要抓取一堆注入的服務并一個一個地執行這些服務的一些操作。為簡單起見,我們將這些服務稱為“步驟”,因此它非常類似于多步驟場景,其中每個步驟操作實際上是某個注入服務的方法。這當然很容易。但我想知道使用后備方法進行一些巧妙的錯誤處理。所以假設我有三個服務和三個方法來呼叫它們。如果第一個失敗,我需要對其觸發回退方法。如果第二個失敗,我需要從第二個呼叫回退,然后是第一個。如果第三步失敗,我需要從第三步呼叫回退,然后從第一步呼叫第二步,最后是第二步。
使用簡單的 try/catch 塊易于編碼,如下例所示。我只是在尋找更聰明的方法來做那件事。關于如何將這段代碼重構為更易于管理的任何提示?它看起來很糟糕,特別是如果它發展成十步場景。
我使用了作業流核心包(https://github.com/danielgerlag/workflow-core)以及 Elsa 作業流(https://elsa-workflows.github.io/elsa-core/),但它們只是看起來有點矯枉過正。我不想在我的應用程式中進入完全訊息或事件驅動的模型。我只需要他們允許你做的那種很好的后備機制。
https://dotnetfiddle.net/WRLRy1
public class Program
{
public static void Main()
{
var step1 = new Step1();
var step2 = new Step2();
var step3 = new Step3();
try
{
step1.DoSomethingInStep1();
}
catch
{
step1.FallbackFromStep1();
}
try
{
step2.DoSomethingInStep2();
}
catch
{
step2.FallbackFromStep2();
step1.FallbackFromStep1();
}
try
{
step3.DoSomethingInStep3();
}
catch
{
step3.FallbackFromStep3();
step2.FallbackFromStep2();
step1.FallbackFromStep1();
}
}
}
public class Step1
{
public void DoSomethingInStep1() {}
public void FallbackFromStep1() {}
}
public class Step2
{
public void DoSomethingInStep2() {}
public void FallbackFromStep2() {}
}
public class Step3
{
public void DoSomethingInStep3() {}
public void FallbackFromStep3() {}
}
uj5u.com熱心網友回復:
您可以使用堆疊來保存作業進度所需的所有回滾步驟。當它出錯時,只需運行堆疊中的所有回滾步驟。
這是代碼 -
public interface IStep
{
public void Do();
public void Rollback();
}
public static class StepHelper
{
public static void RunSteps(List<IStep> steps)
{
var rollback = new Stack<Action>();
try
{
foreach (var step in steps)
{
rollback.Push(step.Rollback);
step.Do();
}
}
catch (Exception ex)
{
//handle exception...
//roll back all changes
while (rollback.Count > 0)
{
rollback.Pop()();
}
}
}
}
public class Step1 : IStep
{
public void Do()
{
Console.WriteLine("Do step1 ...");
}
public void Rollback()
{
Console.WriteLine("Roll back step1 ...");
}
}
public class Step2 : IStep
{
public void Do()
{
Console.WriteLine("Do step2 ...");
}
public void Rollback()
{
Console.WriteLine("Roll back step2 ...");
}
}
public class Step3 : IStep
{
public void Do()
{
Console.WriteLine("Do step3 ...");
throw new Exception("test exception...");
}
public void Rollback()
{
Console.WriteLine("Roll back step3 ...");
}
}
測驗運行 -
StepHelper.RunSteps(new List<IStep>()
{
new Step1(),
new Step2(),
new Step3()
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/482906.html
