
void ומסומנות IsOneWay = true. התשובה לא חוזרת דרך הפונקציה עצמה, אלא דרך קריאה מהשרת ללקוח.ICalculatorCallback, שהלקוח צריך לממש. הוא מכיל את הפונקציה GetResult שמקבלת את התוצאה. גם היא void ו-one-way.ServiceContract של הממשק הראשי מוסיפים CallbackContract = typeof(ICalculatorCallback). כך הלקוח מכיר את הממשק בפרוקסי.OperationContext.Current.GetCallbackChannel<ICalculatorCallback>(). הפונקציות (add, subtract וכו') מחשבות ואז שולחות את התוצאה דרך GetResult.WSDualHttpBinding (Dual HTTP). השם Dual מזהה ביינדינג שתומך בדופלקס.הטקסט המלא של הדקות הראשונות בהרצאה «Duplex - Server Side» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
השיטה השלישית והאחרונה במסג' אקסצ'יינג' פאטרן נקראת דופלקס. דופלקס זאת שיטה שאומרת דבר כזה: לקוח יכול לשלוח לשרת הודעה, או יותר נכון לקרוא לפונקציה בצד של השרת מתי שבא לו, וזה בעצם השיטה הסטנדרטית הקלאסית שאנחנו מכירים.
אבל בשיטת דופלקס גם השרת יכול לקרוא ללקוח מתי שבא לשרת ולשלוח לו הודעה. אפשר להתייחס לזה כאילו שזה איזשהו אירוע שהשרת מרים, ולקוח תופס, אבל אפשר, עדיף להתייחס לזה כקריאה רגילה לפונקציה שהשרת יכול ליזום.
מתי דבר כזה יהיה טוב לנו? בוא נניח שלקוח קורא לשרת בקריאות רגילות לפונקציות, אבל כשהשרת רוצה להודיע משהו ללקוח, בלי קשר לקריאה שהלקוח קרא, השרת יכול פשוט לפנות לפונקציה בלקוח ולקרוא לה, והפונקציה הזאת תתבצע.
דוגמה, מערכת חיפוש. לקוחות יכולים ליזום כל מיני הודעות לחיפוש אבל כאשר השרת מצא את מה שהם מחפשים אז הוא קורא ללקוח ואומר לו מצאתי הנה מה שחיפשת לדוגמה קנייה של רכבים קנייה של חפצים דירות וכולי מערכות שהשרת רוצה להעביר להם פרסומות נניח אני מאפשר לזה שהיא מערכת חינמית כמו לדוגמה sms חינמי לקוחות
יכולים ליזום שליחת smsים כאשר השרת קורא את כל ה smsים ומחפש מילים מסוימות במידה והוא מצא איזו מילה שהוא רוצה להודיע על הפרסומת, שולח בחזרה תשובה או יוזם קריאה ללקוח עם פרסומת.
אז יש המון המון שימושים לשיטה הזאת. אנחנו ניקח את הדוגמה של הקלקולטור ונראה איך אנחנו יכולים להפוך את הקלקולטור שכתבנו לכזה שעובד עם דופלקס.
זאת אומרת שלקוח קורא לשרת מתי שבא לו בשביל לבקש חישוב מסוים וכאשר יש תשובה על השרת הוא יוזם בעצמו את הקריאה ללקוח ונותן לו את התשובה. אז אנחנו צריכים לבצע כמה שינויים גם בצד של השירות ב-DLL וגם בצד של הפרוקסי.
אז בואו נסתכל קודם כל איך אנחנו יכולים לעשות את זה. אז דבר ראשון אנחנו צריכים לקחת את האינטרפייס שבנינו ולראות שכל הפונקציות בו חייבות להיות one way.
בדופלקס כל הפונקציות הם one way אבל כלקולטור הוא לא one way כי אני קורא ל-add והיא מחזירה לי ערך או subtract והיא מחזירה לי ערך.
אז אנחנו נהפוך אותם לכאלה שהן מחזירות void. בואו נרשום פה void בכל הפונקציות האלה. וזה בעצם האינטרפס שיש לנו בצד של השרת שמתאר את הפונקציות שאני חושף ללקוח.
עכשיו, איך השרת הולך לקרוא לפונקציה שנמצאת בלקוח? הרי ברור שהשרת לא מכיר בכלל את הלקוח, לא מכיר את הפונקציות שיש לו, לא מכיר את המחלקות שיש לו.
איך בדיוק הוא יכול לעשות את זה? אז קודם כל אנחנו רוצים שהפונקציה הזאת שהשרת הולך לקרוא לה בצד של הלקוח, זו פונקציה שמחזירה את התשובה.
נניח לקוח קרא ל-Subtract, שלח לה שני ערכים, אנחנו רוצים שהפונקציה תשלח ללקוח את התשובה של ה-Subtract הזה. אז איך אנחנו עושים את זה אם אנחנו לא מכירים שום דבר שקיים בלקוח?
אז מה שאנחנו צריכים לעשות, אנחנו צריכים להוסיף ל-CalculatorLibrary עוד אינטרפייס. בואו נבחר באינטרפייס, ניתן לו שם משמעותי, נקרא לו iCalculator, callback, שזה בעצם שם טוב עבור דופלקס מבחינת אינטרפייס שקיים אצל הלקוח.
עכשיו, מה זה בדיוק האינטרפייס הזה? האינטרפייס הזה הולך להחזיק את הפונקציה שהשרת הולך לקרוא לה ושהיא אמורה להיות בצד של הלקוח.
זאת אומרת שהלקוח הולך לממש את האינטרפייס הזה, להגדיר לנו איזושהי מחלקה שהוא רוצה שמממשת את האינטרפייס, ושם במחלקה הזאת בגלל שהוא מימש את האינטרפס הוא חייב לממש את הפונקציה.
וזה אומר שהשרת יכול לדעת איזה פונקציה קיימת אצל הלקוח. אז בואו נגדיר את האינטרפס הזה כפאבליק כדי שהוא ייחשף מחוץ ל-DLL ובנוסף אנחנו אמורים לכתוב פה את הפונקציה שהשרת הולך לקרוא לה בשביל להביא ללקוח את ההודעה מפעולת החישוב.
אמרנו כל הפונקציות חייבות להיות is one way אז גם אותה נחזיר void ונקרא לה גט ריזולט שמקבלת דאבל ריזולט אז איך אנחנו