DCSIMG
June 2011 - Posts - I Love C#
Sign in | Join | Help

I Love C#

Eyal Vardi

June 2011 - Posts

מבט על העתיד

פורסם בתאריך Jun 22 2011, 08:36 PM על ידי Vardi

היום הייתי בכנס ISV של מיקרוסופט במוזיאון ישראל. E4D לקחה שם חסות. ההרצאה האחרונה הייתה של פרופסור דוד פסיג, מרתק. מי שהפסיד יכול לבוא לערב פתיחה של ExpertDays 2011 (חינם ב-10.7 במגמות, פרטים באתר ) ולשמוע את ההרצאה של ד"ר אשר עידן, מרתק לא פחות !!!

מה ההרצאה עשתה לי? היא גרמה לי לחשוב על קצב התפתחות הקוד והתוכנה(מכרטיסיות לדוט-נט). ולהבין ע"פ פסיג שהקצב הוא לא לינארי אלה אקספוננציאלי. לפיכך אלו התובנות שלי.

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

2. הדרך לכתיבת תוכנה במהירות שיא מצריכה תשתיות מוכנות + מחוללי יישומים. זה הסיבה שאנחנו נחזור בגדול למוצרים כמו מגיק, Power Builder  בתרגום למיקרוסופט ==> LightSwitch , Dynamics CRM. כבר היום אני רואה את הגידול בפיתוח פרויקטים גדולים של כמה שנות אדם טובות עוברות מדוט-נט טהור ל-CRM מה שנקרה xRM.

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

4. הפירוש תוכנה טובה בעתיד לא יתמקד בביצועים,שרידות ארכיטקטורה או כל הדברים שהלקוח הסופי לא מודע להם בצורה עקיפה.
תוכנה טובה תהיה תוכנה שפותרת בעיה (רעיון טוב, איפיון טוב) עם ממשק משתמש טוב, כלומר הביקוש יהיה לאנשים יצירתיים,מאפיינים,מנתחי מערכות לא למפתחים עם ידע, כי לא תהיה בעיה לפתח תוכנה ומהר. הפיתוח עצמו יהיה פשוט וזה נקודה Singularity ע"פ דעתי, היום פיתוח תוכנה מסובך…

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

מה אתם חושבים?

Silverlight Validation & Data Annotation

פורסם בתאריך Jun 16 2011, 12:43 PM על ידי Vardi

Silverlight Validation & Data Annotation

בשבוע האחרון נתקלתי במספר שאלות על נושא Validation ולכן החלטתי לעשות סדר ולהסביר את המנגנון שנמצא ב-SL .

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

clip_image002

אוביקט ה-Binding לקח את הערך מפקד ה-UI למשל TextBox, את הערך מהפרופרטי Text ומכניס אותו לאוביקט שלנו. עכשיו נשאל את השאלה מי עושה לערך המוכנס את ה- Validationואיך מדווחים על שגיאות?

יש מספר דרכים לעשות את הבדיקות לערך המוכנס:

1. בדיקה רגילה בתוך ה-Set של ה-Property ( Databinding עובד רק על פרופרטי Public)

clip_image004

2. עבודה עם Attributes ששיכים למשפחת Data Annotation

clip_image006

כיום העבודה עם Data Annotation היא הדרך הפופולרית יותר, בגלל הפשטות והיכולת לעבוד עם סיפרית ה-Attribute גם בצד השרת וגם בצד הלקוח. WCF RIA Services ו- ASP.NET MVC עובדים עם טכנולוגיה זו.

כאשר הבדיקה נכשלת איך מדווחים לשכבת ה-UI שהערך המוקלד לא נכון? להלן מספר דרכים לפתרון:

1. זריקת טעות
ע"פ דעתי זו הדרך הגרועה ביותר כי זריקת Exception בתור ה-Set של הפרופרטי מעקב את ה-UI ויש בתוך ה- Exceptionיותר מידע ממה שצריך. כדי שה-Binding יתיחס לשגיאות צריך להדליק אופציה זו.

<TextBox Text="{Binding Model, ValidatesOnExceptions=True} />

2. עבודה עם ממשק IDataErrorInfo ( ישן ולא נוח )
clip_image007

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

כדי שה-Binding יתיחס לשגיאות צריך להדליק אופציה זו.

<TextBox Text="{Binding Model, ValidatesOnDataErrors=True}" />

3. עבודה עם ממשק INotifyDataErrorInfo
clip_image009

הרבה יותר נוח מהקודם בגלל האירוע שמדווח לי שיש בעיה ואז אני יכול למשוך את כל הבעיות דרך המתודה GetErrors ע"פ הפרופרטי הרלוונטי. כדי שה-Binding יתיחס לשגיאות צריך להדליק אופציה זו. (ValidatesOnNotifyDataErrors=True, זה ערך בברירת המחדל )

<TextBox Text="{Binding Model, ValidatesOnNotifyDataErrors=True}" />

ב-WPF לא קיים INotifyDataErrorInfo, אני מקווה מאוד שבגירסה 5 הם יוסיפו אותו.

4. עבודה עם אוביקט Validator
ב-SL רק הפקד DataGrid יודע לעבוד עם Data Annotation כל שאר הפקדים מצריכים מאיתנו לכתוב קוד שיודע להבין את Attribute ולפעול בהתאם. לשם כך נשתמש במחלקה Validator.
כדי שה-Binding יתיחס לשגיאות צריך להדליק את האופציות הבאות:


<TextBox Text="{ Binding Model,
ValidatesOnExceptions = True,
NotifyOnValidationError= True }" />

מה עושה, NotifyOnValidationError= True? מפעיל Routed Event כדי לדווח לאבא.

clip_image010

clip_image012

הבעיה כאן שהמחלקה Validator זורקת טעות, וזה לא לטעמי, מהסיבות שפרטתי בסעיף 1. כדי שלא יהיה לנו Exceptions אנחנו צריכים לעבוד עם המתודה TryValidateProperty. הבעיה שאז איך ה- Binding ידע על השגיאות? התשובה לעבוד עם אחד הממשקים, וב-SL כמובן שנבחר ב- INotifyDataErrorInfo. אם מסתכלים על המתודה TryValidateProperty אנחנו רואים שהיא מקבלת <ICollection<ValidationResult ששם מאוחסנים כל הטעויות של Validation. לכן הממשק INotifyDataErrorInfo השתמש במאגר זה לדווח על טעויות. לדוגמא לכך אפשר לקרוא בפוסט Silverlight 4 MVVM Validation using INotifyDataErrorInfo.

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

כמעט לכל הפקדים שיכולים לקבל Input יש מצב של טעות (InvalidFoucused & InvalidUnfocused) שבעזרת Blend אפשר לשנות עיצוב זה בקלות.

clip_image013
השאלה שנשאלת היא מי מעביר את ה-State למצב של InvalidFocused? האם זה ה-Binding או הפקד עצמו? התשובה היא שה- Bindingזורק אירוע שנתפס ע"י הפקד, והפקד מעביר את עצמו למצב של InvalidFocused או InvalidUnfocused. אם אנחנו רוצים גם להירשם לאירוע של השגיאות אנחנו נרשמים לאירוע ה- BindingValidationError שמוגדר ב- FrameworkElement.

סיכום:

אני מאוד אוהב את העבודה עם Data Annotation והתוספת שמחברת את השגיאות ל- INotifyDataErrorInfo. WCF RIA Services נותן לנו את זה בחינם, אך אין בעיה גם לכתוב את השורות אלו בעצמנו ב- ViewModelBase. פתרון עוד יותר נקי זה להכניס את זה לתוך הפקד כמו שעשו ב-DataGrid ו-DataForm.

bn1

Deploy a web application with SQL CE 4.0 database to IIS host with SQL Server

פורסם בתאריך Jun 08 2011, 06:05 AM על ידי Vardi

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

1. צריך להתקין את המנוע שמריץ את CE, איך עושים את זה?

לחיצה בוויז'ואל סטודיו על הפרויקט ובחירה של Add Deployable Dependencies. כתוצאה מכך יתוסף לכם תקייה בשם bin_deployableAssemblies ששם יש את כל מה שצריך השרת כדי להריץ את SQL CE.

Untitled

מקווה שעזרתי סמיילי