מדריך WCF – הקדמה

הקדמה

WCF זה ראשי תיבות של Windows Communication Foundation. הרבה לפני ש – WCF הגיע לאויר העולם יכולנו לכתוב אפליקציות מבוזרות – כלומר – אפליקציות שבצד אחד יש לקוח ובצד שני יש שרת והם מתקשרים ביניהם, התקשורת התבצעה במגוון דרכים, הפופולרית היא כמובן WebService אבל יש עוד הרבה דרכים כמו Remoting ואחרים, כמובן שבכל צורת תקשורת צריך לבחור את הפרוטוקול ולכל צורת תקשורת יש את היתרונות והחסרונות שלה, החל מניהול תהליכים עד לענייני Security.

WCF זה לא המצאה חדשה או דרך חדשה ליצירת תקשורת בין מחשבים, זה בא פשוט לעשות סדר בבלגן ולתת דרך אחת שבה אנו כמפתחים יוצרים תקשורת בין מחשבים ובצורה מאוד פשוטה על ידי הגדרות בקונפיג או מקוד נוכל להחליט מה היא צורת ההתקשרות ובאיזה פרוטוקול ומה הם התכונות שיש בתקשורת.

כמובן שזה נשמע פשוט מאוד, אך בפועל למי שלא מכיר WCF קובץ הקונפיג יכול להיות סיבוך אחד גדול, ולכן במדריך הזה אני אנסה לתת הסבר פשוט על מה זה ואיך משתמשים ב – WCF.

WCF פרק 1 – מה זה Service ומה זה Contract

רשימת נושאים בפרק 1:

  • מה המשמעות של Service.
  • מה זה Contract ומה ההבדל בין ServiceContract לבין OperationContract.
  • כיצד מתחילים לכתוב Service.
  • מה זה DataContract ומה זה DataMember.

מה המשמעות של Service

כדי לכתוב שירות כלשהו בשרת שלקוחות יוכלו לפנות אליו ולהפעיל אותו, אנחנו צריכים כמובן לכתוב אחד כזה, Service הוא בסך הכול מחלקה שמממשת מתודות שהוחלט מראש שהשירות הזה צריך לממש.

למשל – נניח שאנו רוצים שירות של מחשבון, נצטרך לממש מתודה שמקבלת שני מספרים ומחזירה מספר.

מה זה Contract ומה ההבדל בין ServiceContract לבין OperationContract

בחיים אנו כותבים הרבה מחלקות שיש להם פונקציונליות כלשהו, ברור שלא כל אחד מאותם מחלקות הוא Service שכל אחד יכול לגשת ולהפעיל אותו, כדי שמחלקה מסוימת תוכר כשירות היא צריכה לממש Contract.

Contract זה בסך הכול מילה אחרת ל – Interface, למעשה אנחנו צריכים להגדיר Interface שמחצין את אותם מתודות שיהיה ניתן להפעיל מרחוק, כמובן שלא כל Interface מוכר כ – Contarct שמייצא שירותים החוצה, כדי להגדיר שה – Interface הוא WCF Contract צריך להוסיף מעל ה – Intreface את ה – Attribute של ServiceContarct, למשל

[ServiceContract]
public interface ICalc
{
}

כשכתבנו את ה – Attribute על ה – Interface הגדרנו אותו כממשק שמחצין החוצה את המתודות שלו ללקוחות.

זה עדיין לא מספיק מכיוון שיתכן שאנו לא רוצים לחשוף החוצה את כל המתודות שיש ב – Interface, ולכן כל מתודה שנרצה שתהיה מוחצנת החוצה נוסיף לה את OperationContract, למשל:

[ServiceContract]
public interface ICalc
{
[OperationContract]
public int Add(int a, int b); }

כיצד מתחילים לכתוב Service

בשלב ראשון צריך להגדיר את ה – Contract, מאוד מומלץ לעשות את זה בפרוייקט נפרד (Assembly) ולא לכתוב באותו פרוייקט גם את ה – Contract וגם את המימוש שלו.

לאחר מכן צריך לממש את ה – Contract, נוסיף פרוייקט חדש ואחד מהמחלקות צריך לממש את ה – Interface, למעשה זה כל מה שצריך לעשות – תיאורטית המימוש לא צריך לדעת שהוא WCF Service, בחיים האמיתיים זה לא בדיוק ככה ולרוב המחלקה שמממשת את ה – Contract צריכה לדעת מידע על סוג השירות, נדבר על הנושא בפוסטים אחרים.

מה זה DataContract ומה זה DataMember

לפעמים המתודות שמוגדרות ב – Contract צריכות לקבל או להחזיר אובייקטים, למשל:

[ServiceContract]
public interface ICalc
{
[OperationContract]
public int Add(int a, int b);
[OperationContract]
public int Add2(Dolar a, Shekel b); }

(בפוסטים אחרים נדבר על איך אפשר להשתמש במנגנון ה – Overload ולא לתת שמות כמו Add2)

הבעיה עם מה שראיתם היא – שהמחלקות Dolar ו – Shekel צריכות לעבור סרילזיציה, כדי לאפשר זאת צריך לכתוב את המחלקות בצורה הבאה

[DataContract]
public class Dolar
{
[DataMember]
public int Value { get; set; } }
[DataContract] public class Shekel {
[DataMember]
public int Value { get; set; } }

למעשה כל אובייקט (שלנו) שנרצה להעביר ב – WCF צריך את ה – Attribute של DataContract ובנוסף כל מאפיין של אותו מחלקה שנרצה שיעבור בין הלקוח לשרת צריך להוסיף לו DataMember.

בחלק הבא אסביר כיצד מארחים שירות של WCF ברשת כך שלקוחות יוכלו אכן לפנות אליו.

תגיות:

תגובות בפייסבוק