DCSIMG
Validation Application Block with Strippers: ObjectCollectionValidator (Overview of all VAB Validators) - Justin myJustin = new Justin( Expriences.Current );

Validation Application Block with Strippers: ObjectCollectionValidator (Overview of all VAB Validators)

 image

 

סדרת לומדים Validation Application Block עם חשפניות

1. קדם דבר: למה צריך וולידציה? (או: "קופים. פשוט קופים."), פורסם ב-26.6.2007

2. חלק ראשון: הפתרון הקיים והמצוי ב-Winforms, Console ו-ASP.Net (או: "איך קוראים לך ובת כמה את?"), פורסם ב-8.7.2007

3. חלק שני: שימוש ישיר ב-Validatorים של VAB (או: "איך לגרום לקוד יחסית קריא להפוך להיות ארוך ומעיק"), פורסם ב-9.7.2007

4. חלק שלישי: הכנסת נתוני הוולידטורים לתוך מחלקות (או: "ממלכתי עבור וולידטור ג'נארי"), פורסם ב-10.7.2007

5. חלק רביעי: אינטגרציה בסיסית עם ה-GUI ו-וולידציה מתוך קבצי קונפיוגרציה (או: "קצת יותר Drag&Drop, קצת פחות קוד"), פורסם ב-11.7.2007

6. חלק רביעי המשך: אינטגרציה בסיסית עם ה-GUI ו-וולידציה מתוך קבצי קונפיוגרציה (או: "קצת יותר Drag&Drop, קצת פחות קוד"), פורסם ב-12.7.2007

7. StringLengthValidator - בודקים שהכניסו שם חשפנית, פורסם ב-15.7.2007

8. RangeValidator - נו, תן ציון ל-Lap dance שקיבלת, פורסם ב-16.7.2007

9. DateTimeRangeValidator - מתי ביקרת אצלנו?, פורסם ב-17.7.2007

10. ContainsCharctersValidator ו-Negated - איך קוראים לך?, פורסם ב-18.7.2007

11. RelativeDateTimeValidator - מתי היום-הולדת שלך?, פורסם ב-22.7.2007

12. PropertyComparisonValidator ושני וולידטורים על אותו מאפיין - נבדוק שהמבקר נולד לפני שהוא ביקר במועדון, פורסם ב-24.7.2007

13.  RegexValidator - בודקים את הדוא"ל של המבקר , פורסם ב-26.7.2007

14. DomainValidator - מה הסוג משקה אלכוהולי האהוב עלייך?, פורסם ב-29.7.2007

15. ObjectValidator - מה המספר פלאפון שלך?, פורסם ב-31.7.2007

16. ObjectCollectionValidator - מה המספרי פלאפון של החברים שלך?, פורסם ב-22.11.2007

 

ObjectCollectionValidator - מה המספרי פלאפון של החברים שלך?

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

אבל אנחנו לא יודעים כמה מספרים ירצו הלקוחות למסור, יתכן שאחד, ייתכן ששניים, ייתכן ששלוש.
גם יש הבדלים בין ה-GUIים השונים. הוחלט שב-Winforms נאפשר למסור עד שני מספרים וב-ASP.Net עד שלושה מספרים.

מה נעשה בשביל זה? ניצור אוסף (גם באנגלית: Collection) שיכיל רשימה של פלאפונים השייכים לחברים.

        private List<CellPhone> _friendsCellPhones = new List<CellPhone>();

 

        public List<CellPhone> FriendsCellPhones

        {

            get { return _friendsCellPhones; }

            set { _friendsCellPhones = value; }

        }

נרצה איכשהו, שבדומה ל-ObjectValidator נוכל להריץ גם את כללי הוולידציה של CellPhone על FriendsCellPhones.

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

        private List<CellPhone> _friendsCellPhones = new List<CellPhone>();

        [ObjectCollectionValidator(typeof(CellPhone))]

        public List<CellPhone> FriendsCellPhones

        {

            get { return _friendsCellPhones; }

            set { _friendsCellPhones = value; }

        }

ל-ObjectCollectionValidator ניתן את הטיפוס של שביחס אליו נרצה שכל האלמנטים באוסף יבדקו.

אם היינו רוצים להוסיף את ההגדרה של ObjectCollectionValidator דרך עורך הקונפיגיורציה הגרפי הינו עושים זאת כך.

image_thumb52

image_thumb53

בלחיצה על הכפתור השלוש נקודות (...) בתוך TargetType נוכל לבחור בצורה גרפית איזה מחלקה נרצה שעליה תתבצע הוולידציה של ה-ObjectCollectionValidator.

image_thumb54

נראה איך ה-XML שקיבלנו בקובץ BL.config מהוספת ה-ObjectCollectionValidator:

    <type defaultRuleset="default" assemblyName="BL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"

      name="BL.VisitRating">

      <ruleset name="default">

        <properties>

            ...

          <property name="FriendsCellPhones">

            <validator targetType="BL.CellPhone, BL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"

              targetRuleset="" type="Microsoft.Practices.EnterpriseLibrary.Validation.Validators.ObjectCollectionValidator, Microsoft.Practices.EnterpriseLibrary.Validation, Version=3.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"

              name="Object Collection Validator" />

          </property>

        </properties>

      </ruleset>

    </type>

ב-Winforms כנאמר נוסיף שלושה שדות:

image_thumb55

נביט על המאפיינים של אחד מהם:

image_thumb56

נוכל לראות שהוולידציה מתבצעת כנגד האוסף FriendsCellPhones שהוא מסוג <List<CellPhone.
זה בזמן שאנחנו מבצעים את הוולידציה על TextBox.Text שהוא מסוג string, ולכן נצטרך להמיר בין string ל-<List<CellPhone.

נתחבר לאירוע ה-ValueConvert ונבצע את ההמרה:

        private void VisitRatingValidation_ValueConvert(object sender, ValueConvertEventArgs e)

        {  

            ...

            if (e.TargetType == typeof(List<CellPhone>))

            {

                List<CellPhone> convertedValue = new List<CellPhone>();

 

                convertedValue.Add(new CellPhone(e.ValueToConvert.ToString()));

 

                e.ConvertedValue = convertedValue;

            }

        }

קיבלנו כאן מחרוזת כ-e.ValueToConvert ו"המרנו" אותה ל-<List<CellPhone שנכנס לתוך e.ConvertedValue.

בצורה דומה, ב-ASP.Net אנחנו גם מקבלים מחרוזת ורוצים לבצע וולידציה על <List<CellPhone.

image_thumb57

נתחבר לאירוע ה-ValueConvert של שני ה-PropertyProxyValidators האלו ו"נמיר" מ-string ל-<List<CellPhone.

        protected void objectCollectionValidator_ValueConvert(object sender, ValueConvertEventArgs e)

        {

            List<CellPhone> convertedValue = new List<CellPhone>();

 

            convertedValue.Add(new CellPhone(e.ValueToConvert.ToString()));

 

            e.ConvertedValue = convertedValue;

        }

נראה את ה-ObjectCollectionValidator רץ ב-GUIים:

image_thumb58

image_thumb59

ובאמת רואים שהוולידציות הרלוונטיות מופעלות לכל אלמנט באוסף.

 

נחזור לדוגמת ה-FirstClass, SecondClass ו-ThirdClass ממוקדם.

    public class FirstClass

    {

        private SecondClass _second = new SecondClass();

        [ObjectValidator()]

        public SecondClass Second

        {

            get { return _second; }

            set { _second = value; }

        }

    }

 

    public class SecondClass

    {

        private ThirdClass _third = new ThirdClass();

        [ObjectValidator()]

        public ThirdClass Third

        {

            get { return _third; }

            set { _third = value; }

        }

    }

 

    public class ThirdClass

    {

        private string _maxThreeLetterString;

        [StringLengthValidator(3)]

        public string MaxThreeLetterString

        {

            get { return _maxThreeLetterString; }

            set { _maxThreeLetterString = value; }

        }

    }

נשנה את SecondClass.Third שיהיה אוסף מסוג <List<ThirdClas.

    public class SecondClass

    {

        private IList _third = new List<ThirdClass>();

 

        public IList Third

        {

            get { return _third; }

            set { _third = value; }

        }

    }

נרצה שכל וולידציה על SecondClass תגרור גם ווליציה על כל המחלקות ThirdClass בתוך Third.

    public class SecondClass

    {

        private IList _third = new List<ThirdClass>();

        [ObjectCollectionValidator(typeof(ThirdClass))]

        public IList Third

        {

            get { return _third; }

            set { _third = value; }

        }

    }

נראה איך נוכל להשתמש במחלקות אלו כעת.
כרגיל נאתחל מופע של FirstClass ונדפיס את תוצאות הוולידציה שלו.

            FirstClass firstClassWithNonValidString = new FirstClass();

 

            ValidationResults results = Validation.Validate(firstClassWithNonValidString);

            Console.WriteLine(results.IsValid);

נוסיף גם מופיע אחד וולידי של ThirdClass ומופע אחד לא וולידי של ThirdClass.

            FirstClass firstClassWithNonValidString = new FirstClass();

 

            ThirdClass nonValid = new ThirdClass();

            nonValid.MaxThreeLetterString = "hello world";

            firstClassWithNonValidString.Second.Third.Add(nonValid);

 

            ThirdClass valid = new ThirdClass();

            valid.MaxThreeLetterString = "123";

            firstClassWithNonValidString.Second.Third.Add(valid);

 

            ValidationResults results = Validation.Validate(firstClassWithNonValidString);

            Console.WriteLine(results.IsValid);

ובהרצה נקבל באמת שיש שגיאות בוולידציה של FirstClass:

image_thumb61

כלומר, למעשה VAB עובר אלמנט-אלמנט בתוך האוסף ובודק אם הוא וולידי לפי חוקי האימות שלו.

 

Comments

No Comments