DCSIMG
September 2010 - Posts - I Love C#
Sign in | Join | Help

I Love C#

Eyal Vardi

September 2010 - Posts

OData Viewer Tool

פורסם בתאריך Sep 23 2010, 09:05 PM על ידי Vardi

אני שמח להוציא עדכון ל- Odata Viewer Tool ( בשמו הקודם ADO.NET Data Service Viewer ).

עיקר השינוים שתיקון באג, שיעבוד עם הסכימה החדשה של OData.

להורדה לחצו כאן.

מסכים:

1

במסך זה בוחרים את ה-URL של השירות. ברירת המחדל היא שרות שמדגים את Northwind.

 

2

במסך זה כותבים את השאילתה הרצוי ומקבלים עזרה ע"י Intellisense.

Prism with WCF

פורסם בתאריך Sep 22 2010, 06:21 AM על ידי Vardi

Prism with WCF

Prism היא תשתית מאוד נוחה לבנות ממשק משתמש מורכב שמקבץ לתוך חלון אחד (Shell) מספר מקורות מידע.

clip_image002

בפוסט זה אני רוצה להראות איך אני בונה את הקשר בין ה-UI ל- Web Services ע"י WCF. רצוי מאוד להוריד את הקוד ולקרוא את הפוסט עם קוד פתוח כדי שהדברים יהיו ברורים. ( לחץ כאן )

מה הבעיות איתם אנחנו צריכים להתמודד?

1. איך לקבל Proxy ל- Web Services מבלי שאני מכיר את המימוש ועושה Add Reference ל-Dll של WCF.

2. איך אפשר לעבוד עם ה- Proxy ב- XAML בלבד.

3. איך עובדים עם ה- Proxy ב- Async Mode וגם רואים חיווי ב-UI עד שהקריאה מסתיימת.

4. איך אפשר לקבל Notification מצד השרת.


פתרונות

1. את כל ה- Proxy ים במודל אחד שנקרא לו Communication. בתוך המתודה Initialize של המודל אני רושם ל-Interface את ה- Proxy.

2

מה קיבלנו? קיבלנו מודל Communication והוא היחידי שעושה Add Reference ל-Dll של WCF. כלומר
ע"י Config אני יכול להחליף מודול זה ולקבל Proxy אחר. צריך להדגיש שה- Interface מוכר לכולם לכן הוא יהיה במודל Common. על מנת להשתמש ב- Proxy בתוך ה- Xaml עם יכולות של DataBinding לארגומנטים של המתודה של ה-Proxy, אני אשתמש ב- Action או ליתר דיוק ב- TargetedTriggerAction.

3 
הערות:
  • ה- Xaml נראה ארוך ומסובך אך הוא נוצר ע"י Drag & Drop ב- Blend. ( מלשונית ה- Behaviors ב- Asset)
  • ה- UnityContainer באה מ- ViewModel.
 
clip_image004

יתרונות השיטה:

  • בונה המסכים מקבל אוסף של פעולות ( Actions ) שע"י Drag & Drop ב- Blend הוא יכול להוסיף לוגיקה למסכים.
  • בהתחלה אפשר לעשות שאין Proxy אמיתי (Mockup) אבל עדין אפשר לבנות את המסך ולשלב את הפעולות.
  • הוספת פעולה למסך או ל-UserControl לא מצריכה קוד.

2. הבעיה עם סעיף 2 (בבעיות שיש להתמודד) היא שה- Invoke של ה- Proxy מתבצעה על ה- Thread של ה- UI. בסעיף זה נבצע אותו על Tread אחר וניתן חיווי כל עוד הפעולה לא הסתיימה.

clip_image006

בניתי מחלקה abstract בשם AsyncTargetedTriggerAction שכל מי שיורש אותה צריך לממש את:

  • AsyncInvoke היא מפעילה את ה-Proxy בצורה Async.
  • BeforeInvoke רצה על Thred של ה-UI כך שנוכל לקרוא את המשתנים מסוג DependencyProperty.
  • AfterInvoke רצה על Thred של ה-UI כך שנוכל לכתוב לתוך המשתנים מסוג DependencyProperty את התוצאה.

הערות:

במחלקה AsyncTargetedTriggerAction אני משתמש ב- EventAggregator כדי להפיץ התחלה וסיום של ה- AsyncInvoke. כל ViewModel שרוצה , מאזין לאירועים אלו וזורק את האירועים הרגילים כך ש- EventTrigger יוכל לתפוס אותם ולהפעיל אנימציה ע"י Action. ( למתקדמים, אפשר גם לבנות EventAggregatorTrigger ואז חוסכים את הקוד ב- ViewModel. )

3. ב- WPF כשרוצים שהשרת ישלח Notification מעלים ServiceHost בצד ה-Client. איך ה-Prism עוזר לנו? אנחנו מעלים את ServiceHost במודול ה- Communication. השרות עצמו לא עושה דבר חוץ מלעביר את הנתונים שהגיעו מהשרת לתוך המערכת ע"י ה- EventAggregator. מי שרוצה לקבל את הנתונים נרשם להודעות אלו וגם יכול לקבל אותם על ה-Tread של ה-UI, קיבלנו ע"י כך הפרדה בין ה- WCF לשאר המערכת.

הערות כלליות:

אני מאוד אוהב את היכולות של Visual State Manager (VSM) ואני משתמש איתו בקוד של הדוגמא. ה-VSM נותן לי את היכולת להדליק ולכבות User Control או כל פקד אחר מבלי לכתוב קוד ב- ViewModel זאת ע"י שימוש ב- Actions ו- Triggers. למה זה טוב? אני מאמין שצריך לתת לבוני המסכים (Xaml) את כל הכלים לבנות UI שלם, כלומר כל מה שמתחיל כתוצאה מפעולה של המשתמש. אם מכינים תשתית טובה של Actions ו- Triggers אפשר לבנות את רוב ה- UI ב- Blend והמפתחים מתמקדים בלוגיקה ולא ב-UI.

Composite Applications with WPF and PRISM

פורסם בתאריך Sep 18 2010, 12:33 PM על ידי Vardi

Composite Applications with WPF and PRISM

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

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

קהל יעד: מפתחים וראשי צוותים בסביבת .Net

רמה: 300

יהיו 11 Demos בנושאים הבאים:

1. איך מגדירים UI

2. איך בונים Theme

3. Visual State Managr

4. Behaviors, Action & Triggers

5. Prism Quick Start

6. Prism With WCF

7. Prism With Notification form the server

8. Prism with Async Calls

להתראות במיקרוסופט רעננה ב- 8:30.

Many to Many in LightSwitch

פורסם בתאריך Sep 16 2010, 07:40 PM על ידי Vardi

Many to Many in LightSwitch

לפני כחודש יצא ה- LightSwitch בגרסת ביתא ומאז אני לא מפסיק "לשחק" עם הכלי החדש. אחת הבעיות הראשונות שנתקלים בה היא, שהמוצר לא תומך בקשר של רבים לרבים L . בפוסט זה אני מדגים איך אפשר לעקוף בעיה זו.

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

.clip_image002

זה קל וכך עושים גם במסדי נתונים. שימו לב שאני לא צריך להחזיק בטבלה ( אובייקט ) שדות של EmployeeId ו- OrderId.

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

clip_image004
clip_image005

החלק הבעייתי הוא ,שהגריד של הרשימה של טבלת הקישור ( ManyEmployeeOrderCollection ) מכיל שדה אחד מסוג Order ולא את השדות של Order. בתמונה למטה הורדתי את השדה Employee ובניתי שדה Summary לישות הזמנה שמראה את כל השדות.

clip_image006

אם לוחצים על Add… ,ה- LightSwitch מספיק חכם לתת לי לבחור רק את שדה הזמנה מתוך רשימת ההזמנות הקימות ולא צריך למלא את העובד.

clip_image007

הבעיה שאני רוצה ליצור הזמנה חדשה !!! ואני רוצה לראות את השדות של הזמנה כמו בתמונה הבאה:

clip_image008

ושביל כך נדרש לכתוב קוד בכפתור של ה-Add….

clip_image009

זה יצור לנו מתודה שבה צריך לקרוא למסך CreateNewOrder ולעביר לו כפרמטר את Id של העובד.

77

עכשיו נבנה את המסך CreateNewOrder.

1. חייבים לבחור בתבנית Details Screen כי אחרת לא נצליח לקבל במתודה ShowCreateNewOrder את היכולת לעביר את ה- Id.

2. צריך ליצור במסך Property מסוג Int שיחזיק את ה-Id של העובד.

clip_image010

וצריך לסמן את Property כ- Is Parameter.

clip_image011

3. צריך להוסיף משתנה מסוג עובד עם חיתוך ע"פ ה- EmployeeId שקיבלנו.

clip_image012

ולחבר את Id ל- EmployeeIdProperty.

clip_image013

שלב אחרון – כאשר שומרים את הנתונים צריך להוסיף רשומה בטבלת קישור.

88

סיכום:

1. קצת ארוך מדי לטעמי לתרחיש שכיח מאוד.

2. חבל שלא ניתן ליצור במסך מסוג Create New משתנה שאפשר לסמן אותו Is Parameter  וצריך ליצור מסך מסוג  Details Screen.

Visual Studio LightSwitch – Security

פורסם בתאריך Sep 04 2010, 03:27 PM על ידי Vardi

Visual Studio LightSwitch – Security

מיקרוסופט יצאה עם מוצר חדש (1 Beta ) שנקראה Visual Studio LightSwitch בקיצור LS. LS מאפשר לבנות אפליקציות מבוססות נתונים בקלות רבה, מזכיר סוג של מחולל נתונים. למרות שהמוצר רק בגריסת Beta ראשונה הוא נראה מבטיח ושיש צורך אמיתי במוצר. ממליץ בחום לראות את הסרטים בדף של How To. אני בפוסט זה רוצה לדבר על Security.

LS תומך בשתי צורות של Authentication:

  • Windows Authentication
  • Forms Authentication

כמו שרואים במסך של Application Designer

clip_image001

כאשר בוחרים ב-FA, אנחנו מצפים שנריץ את האפליקציה יקפוץ לנו מסך Login, לא יקרה רק אחרי Publish. מנגנון ה-FA הוא המנגנון המוכר לנו מ-ASP.NET שקיים מגרסה דוט-נט 2.0.

ניתן להגביל ב-LS את החלקים הבאים: (ע"פ Roles או Permissions)

  • Screen
  • Data Entity
  • Query
  • Command

איפה כותבים את הקוד שעושה Authorization?

בכל ישות שעובדים איתה בויזואל סטודיו יש כפתור "Write Code" כאשר לוחצים על כפתור זה יש שם קבוצה של Security Methods ששם כותבים את הקוד של ה- Authorization.

clip_image002

לדוגמא אם אני רוצה להגביל את המחיקה של Employee רק למשתמש שיש Role מסוג Admin.

  code

לסיום כדי שתוכלו לבדוק את הקוד שלכם ע"י Login אתם צריכים לעשות Publish לפרויקט.

clip_image003

ואז שתריצו את האפליקציה שכתבתם, דבר ראשון יקפוץ מסך ה- Login.

clip_image005

מספר נקודות חשובות:

  • כאשר אתם עושים Publish ב-FA אתם צרכים לספק משתמש ראשון, שהוא Admin. משתמש זה יכול להגדיר דרך האפליקציה משתמשים נוספים Roles ו- Permissions.

clip_image007

  • לא מצאתי איפה מעצבים את מסך ה- Login.