שאלה בתפוז: קובץ XML לשמירת Regex Patterns?
החלטתי לאמץ את הרעיון של ג'סטין - להעלות תשובות לשאלות שעלו בפורום בתפוז גם לבלוג, מכמה סיבות:
- לא כולם מכירים את פורום תכנות .NET בתפוז, ואם כבר הגענו עד כאן - זה זמן טוב להזכיר את הפורום ולהזמין את מי שעוד לא כותב שם להצטרף.
- לא כ"כ קל לחפש בתפוז ולכן הרבה הודעות נעלמות שם כלא היו.
- הבלוג מאפשר לענות בצורה טובה יותר עם אפשרות להוסיף תמונות, קוד ועוד.
השאלה:
חשבתי על פתרון של ריכוז כל הRegex שבאפליקציה (למשל בדיקת פורמט אי-מייל, סיסמא וכו') בקובץ XML חיצוני כדי להקל על הניהול והתחזוקה שלהם.
אני לא צריך עזרה בלבצע את זה אלא רציתי לשאול אם מישהו עשה פעם כזה דבר ואם זה מומלץ או שמא יש פתרונות טובים יותר.
בגדול ניתן לשמור נתונים מסויימים שרוצים להמנע מלכתוב אותם בתוך הקוד (Hard Coded מה שנקרא) בהמון דרכים שונות. היתרון של זה - הוא ששינוי הערכים האלו - לא דורש חפירה בתוך הקוד - כל הערכים מרוכזים במקום אחד, וניתן לשנותם בקלות (לעתים אף דרך ממשק שהאפליקציה יכולה לספק), או שהערכים האלו נמצאים במספר מקומות (לדוגמה Regex שמאמת תקינות של אימייל יכול להופיע גם בטופס הרשמה לאתר, הצטרפות לרשימת דיוור, שחזור סיסמה ועוד.
הפתרון הראשון הוא להשתמש ב - Global Resources, זהו מנגנון מובנה ב - .NET והוא קל לשימוש.
Global Resources
ניתן לשמור בקבצי Resources "משאבים", החל מערכים של סטרינג ועד קבצים שלמים.
ה - Resources מתחלקים לשני סוגים:
- Global Resources - משאבים המשותפים לאפליקציה כולה
- Local Resources - משאבים המשותפים לדף מסויים או לטופס מסויים.
בפוסט זה אני אסביר על ה - Global Resources בלבד (על אף שהשימוש בשני הסוגים מאוד דומה), בנוסף ה - Resources מאפשרים גם לתמוך בריבוי שפות, אך אני לא ארחיב על כך בפוסט מכיוון שאין זה מטרתו.
Resources הם קבצי XML (הסיומת שלהם היא resx) שיכולים להחזיק ערכים ואף קבצים - והם מתקמפלים עם האפליקציה (בדומה לקבצי ה - Config).
בכדי להוסיף קובץ Resource לאפליקציה שלנו, יש ללחוץ קליק ימני על הפרוייקט, ולבחור ב Add New Item, מתוך החלון שיפתח נבחר ב - Resource File:
לאחר לחיצה על Add, במקרה של אתר ASP.NET יתריע כי אנחנו מנסים להוסיף קובץ מיוחד שעליו להיות בתיקיית App_GlobalResources וישאל האם אנחנו רוצים להוסיף את הקובץ לתייקיה הזו, תאשרו לו לשים את הקובץ בתיקיה זו.
לאחר מכן יפתח העורך של קבצי Resources, המצב הדיפולטי של העורך, הוא עריכה של ה - Strings בקובץ - טבלה עם שלוש עמודות:
- Name - השם של הערך
- Value - הערך עצמו
- Comment - הערות שניתן להוסיף לצרכי תיעוד וכיו"ב.
להלן דוגמה להוספה של ערך לקובץ:
בכדי לגשת לערך, נלחץ על Save ונעבור לקוד כלשהו באפליקציה שלנו שאנחנו רוצים לשלוף בו את הערך הזה.
ה - Resources נמצאים אוטומטית תחת מרחב השמות Resources (שימו לב כי יש מרחב שמות System.Resources שמכיל בתוכו מחלקות של ה - Framework).
שם ה - Class של המשאבים שלנו יהיה זהה לשם הקובץ ללא הסיומת שלו:
ניתן גם לגשת למשאבים דרך דף ה - ASP.NET עצמו בצורה הבאה:
עד כאן על קבצי Resources, ניתן לקרוא עוד על הנושא ב - MSDN, ובאתר asp.net:
שימוש בקבצי XML מותאמים אישית
ניתן לשמור את הנתונים בקבצי XML שאנחנו ניצור שישמרו תחת התקייה App_Data, ולגשת אליהם דרך מחלקות שיגשו לקבצים וישלפו את הערכים.
ב - 4GuysFromRolla יש מאמר מעולה, שמסביר איך ליצור את המנגנון הזה - כולל Caching של קובץ ה - XML (מכיוון שקריאה מקבצים באופן תדיר היא לא יעילה (ולא חכם לעבוד כך)): Using XML to Share Constants Across Projects.
במאמר מוסבר כיצד ליצור את קבצי ה - XML ואת המחלקות שמטפלות ושלופות מהקובץ, איך להתעסק עם ה - Cache וגם איך ליצור גרסאות (כך שניתן בקלות להעלות את הקבצים ל - Testing או ל - Production עם ערכים אחרים מבלי לערוך את הקבצים לפני שמעלים או על השרת).
לשתי השיטות יתרונות וחסרונות משלהן, ה - Resources נותנים יכולות כמו Localization, ובנוסף ניתן לערוך אותם עם עורך פשוט.
קבצי ה - XML מאפשרים ליצור Versions וגם ממשק לעריכה שלהם בזמן ריצה דרך האפליקציה בקלות יחסית (לקבצי ה - Resource יש פורמט טיפל'ה מסובך).