בפרויקט מסוים עלתה דרישה לאפשר מערך הרשאות דינמית בתצוגה, כלומר לייצר מספר (דינמי) של פרופילי משתמש במערכת ולכל אחד לאפשר ביחד לרכיבים מסויימים במסך לאפשר גישה, להגביל לצפייה בלבד או להעלים לגמרי.
התצוגה מבוססת WPF וצד הלקוח כולו מבוסס PRISM ו MVVM והשאיפה היא למינימום קוד בתצוגה.
דרישות מהמערכת:
-
דינמיות בזמן ריצה של ההרשאות (לא לקודד אותן)
-
שליטה מהVM על ההרשאות (מינימום קוד בתצוגה)
-
יכולת לקבץ מספר מאפיינים עם אותה הרשאת גישה, עם זאת לאפשר שליטה ברמת השדה.
-
יכולת לקריאה בלבד/ הסתרה מלאה של מרכיבי תצוגה.
-
צימוד של רכיבים קשורים בתצוגה (תוית-> תיבת טקסט)
-
יצירת מספר פרופילים שונים שאינם קבועים מראש.
לטובת העניין כתבתי תשתית מאד פשוטה אבל יעילה המאפשרת עם Attribute פשוט בVM וBehavior בXAML לשלוט על העניין.
העיקרון פשוט – מצמידים תוית כלשהיא לשדות בVM. בBehavior מצמידים עם Binding מאפיינים בVM והוא דואג לשלוט בתצוגה.
הbehavior יכול להיות מוצמד למיכל של מספר נתונים למשל וכך לשלוט בכולם יחד. בVM התוית יכולה להיות מוצמדת למספר מאפיינים וכך לשלוט בהן כקבוצה.
המתכנת צריך לממש ממשק מאד פשוט שלמעשה שואל אותו לגבי תוית מסויימת מהי ההרשאה הנדרשת. את הProvider הזה מאתחלים עם העלייה של האפליקציה (bootstrapper in prism). מאחוריו ניתן להסתיר מימוש של קבצי XML, שירותים מקוונים וכו’.
חסרון מסויים זה שReadOnly למעשה מגדיר את רכיב התצוגה כIsEnable=false שזה לא ממש ReadOnly, ע”מ להתגבר על זה בחרתי לאפשר החלפה של DataTemplate מסויים.
דוגמא למורכבות של העניין – נניח שיש רשימה של אנשים וניתן לערוך את השם שלהם. במידה והוגדר לקריאה בלבד אם נהפוך את הרשימה לIsEnable=false לא נוכל לגלול או לבחור אנשים משם. ואם הרשימה הזו מקושרת בMaster/Detail לאובייקט אחר אז מאבדים את היכולת הזו.
אני מניח שככל שנתקדם ניתקל במקרים מורכבים יותר שידרשו עוד התאמות.
בכל אופן העליתי את התשתית הזו לcodeplex עם דוגמא פשוטה ניתן להגיע אליה – ב http://uiauth.codeplex.com/
אשמח לרעיונות נוספים… 