יום חמישי, 21 במרץ 2013

C# Define

למדתי לא מזמן שימוש באפשרות יפה ש#C  מאפשר לנו.

קודם כל אתחיל בסיפור מקרה:
קורה לא פעם שאני מסתכל על קוד שמישהו כתב בעבר, ובקוד כתובים המון מתודות שהשימוש שלהם נכון רק בזמן debug למשל. (למשל כתיבה ל event log לצורך טסט או דיבוג).
אבל כאשר הקוד רץ בסביבת Production אין לנו צורך במטודות, ואף זה משפיע לרעה (כתיבה לא רצויה ל event log משפיעה על ביצועי הדיסק..)

לכן יש לנו את האפשרות הבאה:

#define debug
//#undef debug
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace example
{
    class Program
    {
        static void Main(string[] args)
        {
            #if debug
                Console.WriteLine(1);
            #else
                Console.WriteLine(2);
            #endif
            ForDebug();
        }

        [Conditional("debug")]
        static void ForDebug()
        {
            Console.WriteLine("in debug function");
        }
    }
}
נגדיר בתחילת הדף סמל (במקרה שלנו נקרא לסמל שלנו debug) וכעת בקוד שלנו נוכל לבצע התניות לפעולות אך ורק אם הסמל מוגדר בתחילת הדף. שימו לב שאפשר להגדיר גם על פונקציה שלמה.

ככה למשל לפני ירידה ל production נוכל להסיר את הסמל (ע"י undef), וכעת לא יבוצעו מטודות שלא רצינו שיפעלו בסביבת ה production..

תהנו

יום חמישי, 14 במרץ 2013

Scatter Gather Integration Pattern

Scather Gather זוהי תבנית שימושית מאוד. בתבנית זו שולחים מספר הודעות לשירותים שונים, מחכים לתשובה, ו"מחברים" את התשובות מכל השירותים לתשובה עיקרית אחת.


נלקח מכאן

למשל:
לקוח מתקשר לבנק. מערכת הזיהוי מזהה את הלקוח. בעת זיהוי הלקוח (ולפני שהלקוח מגיע לנציג השירות הטלפוני) מתבצעות מספר קריאות לשירותים שונים. למשל לשירות שמחזיר את סכום המשכנתא הנוכחית, שירות שמחזיר את ההלוואות השונות שיש ללקוח, שירות שמחזיר את כל החסכונות של הלקוח, וכד'. לאחר קבלת התשובות מכל השירותים, המידע שהתקבל מוצג לנציג השרות.

יש כמה דרכים לפתרון הבעיה: (לדוגמא ב Biztalk)

פתרון 1: שימוש ב Parallel Shapes
  1. האורכסטרציה מנויה על ההודעה (בסיפור המקרה שלנו, על זיהוי הלקוח)
  2. שימוש ב Parallel Shape: יהיה לנו מספר Sendport כמספר השירותים, או שנקרא לאורכסטרציה אחרת שאחראית לקרוא לשירות (במקרה שלנו יהיו לנו 3 - משכנתא, הלוואה וחסכונות)
  3. שימוש ב Parallel Shape: יהיה לנו מספר Receive כמספר התשובות שאנחנו מצפים לקבל
  4. ולבסוף שימוש במפה, שהמקור שלה מורכב מ שלושה inputs וה output הוא יחיד (זהו הקובץ XML עם כל התשובות מכל השרותים שנשלח למערכת של נציג השרות)
וזה יראה כך:
נלקח מכאן

פתרון 2: שימוש דינמי ע"י Subscriptions

  1. האורכסטרציה מנוייה על ההודעה (במקרה שלנו כאשר הלקוח מתקשר לבנק ומזדהה)
  2. מתבצע מיפוי להודעה הרצויה, וההודעה נשלחת ל MsgBox
  3. יש מספר SendPorts שמנויים על ההודעה (במקרה שלנו יש 3..). כל SendPort מכיל מפה מתאימה לשירות.
  4. בתוך לולאה (עבור כל ההודעות שאנחנו מחכים לתשובה) מתבצע Listen להודעות תשובה מהשרות (עפ"י קורולציה), ומאגדים את כל התשובות להודעה אחת.
  5. לאחר שקיבלנו את כל ההודעות, שולחים את ההודעה המאוגדת ליעד (במקרה שלנו למערכת נציג הלקוחות)
וזה יראה כך:

scatter scope:

gather scope:
נלקח מכאן

אני אישית מעדיף את הדרך הראשונה לפתרון..

תהנו!