ลองเรียกใช้บริการอีกครั้งเพียงครั้งเดียวในบริการเหตุการณ์ล้มเหลวในความช่วยเหลือด้านลอจิก

ผมจึงมีฟังก์ชั่นที่เรียกใช้บริการเว็บซึ่งจะคืนค่า INT ที่บ่งบอกถึงความสำเร็จหรือความล้มเหลวประเภทต่างๆ ที่อาจเกิดขึ้น หลังจากที่ฉันได้รับผลลัพธ์จากบริการ ฉันจึงเรียกใช้คำสั่ง switch และดำเนินการตามสิ่งที่พบในระหว่างการดำเนินการบริการ

private void Example()
{

int Result = ExecuteWebService();

switch(Result)
{
case 0:
//no errors
NoErrorsLogic();
break;
case 1:
// manual retry 
ManualRetryLogic();
break;
case 2:
//  validation error
ValidationErrorLogic();
break;
default:
// Run time error occurred
LogicOptionD();
// At this point I want to to call the service again ONCE just to see if it will succeed
break;
}

}

โดยทั่วไป ฉันแค่เพิ่มการเรียกใช้ฟังก์ชันเพื่อให้เรียกใช้บริการและเรียกใช้ผลลัพธ์อีกครั้ง แต่ฉันไม่ต้องการให้มันทำงานอย่างต่อเนื่องจนกว่าบริการจะสำเร็จ ในตัวเลือกเริ่มต้น ฉันเพียงต้องการบังคับให้ 'ลองอีกครั้ง' เรียกใช้บริการหนึ่งครั้ง - จากนั้นจึงประมวลผลผลลัพธ์ตามนั้น

มีความคิดอะไรบ้าง?


person user234702    schedule 21.12.2010    source แหล่งที่มา


คำตอบ (2)


คุณยังสามารถทำ:

private void Example(bool retry = true)
{


....
default:

if(retry)
{
  Example(false);
}
break;
}

เพียงเพิ่มพารามิเตอร์และให้เรียกใช้ฟังก์ชันเองหากล้มเหลว คุณส่งผ่านค่าเท็จสำหรับพารามิเตอร์ที่บอกฟังก์ชันว่าถ้ามันล้มเหลวอีกครั้ง ไม่ต้องทำอะไรเลย

ใน C# 4.0 Example(bool retry = true) คุณสามารถตั้งค่าเริ่มต้นได้ ดังนั้นคุณไม่ต้องกังวลว่าโค้ดที่มีอยู่จะไม่ได้ตั้งค่าจริงไว้แล้ว ในเวอร์ชัน 3.5 หรือต่ำกว่า ให้สร้างเมธอดโอเวอร์โหลด on โดยมีพารามิเตอร์และเมธอดที่ไม่มีพารามิเตอร์ อันที่ไม่เพียงแค่เรียกอันหนึ่งด้วยดังนั้น:

Example()
{
   Example(true);
}
person kemiller2002    schedule 21.12.2010

แม้ว่าฉันจะเห็นด้วยกับแนวทางของเควิน แต่นี่ก็เป็นอีกแนวทางหนึ่ง:

bool success = false;
bool retry = true;
while (!success)
{
    success = true;
    int Result = ExecuteWebService();

    switch(Result)
    {
    case 0:
        //no errors
        NoErrorsLogic();
        break;
    case 1:
        // manual retry 
        ManualRetryLogic();
        break;
    case 2:
        //  validation error
        ValidationErrorLogic();
        break;
    default:
        // Run time error occurred
        LogicOptionD();
        success = !retry;
        retry = false;
        break;
    }

}

สิ่งนี้จะช่วยให้แน่ใจว่าหากมีตรรกะอื่นในตัวอย่าง มันจะถูกเรียกอีกครั้ง และคุณไม่จำเป็นต้องวางรหัสการประมวลผลการโทรและการตอบสนองบริการไว้ในวิธีแยกต่างหาก (แต่ฉันอยากจะแนะนำให้ทำเช่นนั้น)

person Michael Sagalovich    schedule 21.12.2010