سؤال

لديّ WCF SVC مفصولة إلى طبقة خدمة ، وطبقة منطق الأعمال وطبقة الوصول إلى البيانات.

عندما يواجه DAL استثناء ، هل يجب أن ألتقطه هناك أو أتركه يعود إلى طبقة الخدمة؟ و لماذا؟

يرجى تجاهل أي مشاركة عميل لهذا السيناريو ، أنا مهتم فقط بتسجيل الاستثناءات على WCF SVC.

هل كانت مفيدة؟

المحلول

يعتمد ذلك أيضًا على كيفية تعليم الحل الخاص بك. على سبيل المثال ، إذا كان من المفترض أن تكون طبقات DAL و BLL مكونات مستقلة تمامًا ، فلن يتمكنوا من وضع افتراضات حول من يتصل بهم. على هذا النحو ، ينبغي أن يلتقط كل منهما استثناءات على حدود المكون ، وتسجيل تلك الاستثناءات ، ثم السماح للاستثناء بالانتشار. قد يرغبون في لف الاستثناء العام في استثناء خاص بالطبقة:

catch (Exception ex)
{
    Logger.Log(ex);
    throw new DalException("Unhandled exception in DAL", ex);
}

اذا أنت أعرف سيتم استخدامها فقط كجزء من تطبيقك العام ، ثم يمكنك تأجيل التسجيل إلى الطبقة الخارجية - الطبقة التي ، إذا لم تلمس الاستثناء ، فلن يتم تسجيل الاستثناء.

نصائح أخرى

هناك مصطلح لذلك - التدريع الاستثناء. في الأساس ، يجب أن تمنع استثناءات النظام من السفر إلى مستوى أعلى ، لأن هذا قد يمنح Atacker رؤية بنية النظام الخاصة بك. يمكن أن يلتقط التدريع الاستثناء من WCF استثناءات من نوع معين واستبدالها باستثناءات من النوع الآخر. على سبيل المثال ، يمكن أن يلتقط استثناء Stackoverflow واستبداله بـ SystemException المخصص. إذا كنت تستخدم مكتبة Enterprise ، فيمكنك أيضًا تكوينها لتسجيل هذه الاستثناءات عند استبدالها

باستخدام كتلة معالجة الاستثناء في Enterprise Library 3.0

أعتقد أن هذا يعتمد على كيفية استهلاك الخدمة ومن (إذا كان أي شخص) تريد أن تعرفه عند حدوث استثناء.

على سبيل المثال ، إذا كنت تقوم بتطوير تطبيق للأعمال الداخلية المهمة المهمة ، فقد ترغب في تفاصيل الاستثناء بالفقاعة من خلال طبقة الخدمة إلى واجهة المستخدم التي تستهلك التطبيق حتى يتمكن المستخدم النهائي من الاتصال بالمطور بسرعة إلى المطور بسرعة إلى المطور بسرعة. الحصول على حل المشكلة.

ومع ذلك ، لنفترض أن خدمتك تستهلكها صفحة ويب عامة. ربما لا تزال تريد أن تلتقط طبقة الخدمة الخطأ بطريقة ما ، ولكن قد تختار نقل الحد الأدنى من المعلومات إلى العميل النهائي ، وتقديم رسالة خطأ عام إلى المستخدم النهائي ، وتكتب تفاصيل الاستثناء إلى سجل الخطأ المطورين للمراجعة.

في النهاية ، ما زلت أعتقد أنك تريد الاستثناء أن تتقاطع مع طبقة الخدمة ، ولكن كيف تتعامل مع الاستثناء وتحديد المعلومات التي ستنتقل إلى العميل النهائي لك.

عادة ما أستخدم معالج الأخطاء العامة (System.ServiceModel.Dispatcher.IErrorHandler التنفيذ) يتم إرفاقه بخدمات الويب بواسطة خدمة ServiceBehavior في ملف التكوين.

ال IErrorHandler.ProvideFault تعترض الطريقة على الاستثناءات التي ألقيت من الخدمة و:

  • يسجلهم ؛

  • يمرر الصدع من خلال كما هو ؛

  • يحول استثناءات "Business" (مثل انتهاكات قاعدة العمل) التي ألقيتها BLL إلى FaultExceptions باستخدام رمز خطأ "المرسل/العميل" ؛

  • يحول الاستثناءات الفنية (على سبيل المثال DAL) إلى خطأ مع رمز الخطأ "جهاز الاستقبال/الخادم".

وبهذه الطريقة ، لا يحتوي رمز الخدمة بحد ذاته على رمز العمل ولا يحتاج إلى التقاط أي استثناءات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top