MVVM part 7 – Unity Container Library

16 בFebruary 2013

תגיות: ,
אין תגובות

אם אנחנו רוצים להתקדם ולעבוד עם ספריית Prism, אבל לא רק אלא אפילו כדי
לחוות יכולת חזקה של
dependency Injection  ו IOC אנו מוכרחים לעשות היכרות
עם
unity Container ועם MEF.

אז מאיפה נתחיל? א. אני ממליץ לקרוא על הגדרת Dependency
Injection
כאן, כי אני
לא מדבר בפוסט הנוכחי על הרעיון אלא על הטכנולוגיה כמו גם על
IOC.              

UnityContainer, וגם MEF , הם מוצרים של Microsoft ויש עליהם תיעוד נרחב
ברשת כולל ב
MSDN

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

נתחיל בקצת תאוריה על Unity. אני למעשה מקבל
“קונטיינר” משוכלל אם יכולות של הרחבת התנהגות, קונפיגורציות, הפרדת
תלות, יצירת אובייקטים, ועוזר בהפרדה מוחלטת של
UI  מהלוגיקה (MVVM) כאמור בפרט שמדובר
באפליקציות גדולות.

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

במלחמה בין caliburn Micro  לבין Prism כמובן שגם הנושא הזה תופס
חשיבות,
Prism  באופן מסורתי רץ עם Unity לפחות בגרסאות הראשונות..
ואילו
caliburn רץ עם MEF.

Unity משתמש בטייפים (Type) כדי לאפיין אובייקטים. אנו רושמים לספריית
השירות אובייקטים שונים לפי הטייפ שלהם, ומתי שהוא מישהו יפנה לספריית השירות
וישלוף את האינסטנס המבוקש. זאת הקלאסיקה של
Unity בהקשר של WPF– הפרדת תלות/התנהגות,Unity
 משמש
פשוט כ”תיבת אוצר” שמכילה המון אובייקטים שניתן לשלוף לפי הצורך.

א.    
נפתח
פרוייקט
Consol  ונתחבר לDLL של Unity  את הספרייה
אפשר להוריד
מכאן. העניין
הוא שבהורדה הרשמית הוא מגיע עם כל מיני דברים לא נחוצים ואני בשלב זה מסתפק ב
DLL  המרכזי שתמצאו אותו בתיקיית הbin  ונקרא Microsoft.Practices.Unity.dll.

ב.    
ברגע שיש
לנו את ה
DLL   בתכנית יש לנו את מלא היכולות של Unity והיכולות הן רבות וארחיב עליהם
כשאציג אפליקציה מלאה שמשתמשת ב
Prism + Unity בשלב זה ננסה שימוש בסיסי
לצרכי היכרות בצורה הבאה:

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

 public interface ISpecialservice
    {
        void GetData();
    }
    class Service : ISpecialservice
    {
        public void GetData()
        {
            Console.WriteLine("untiy service in active");
        }
    }

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

 class Client
    {
        IUnityContainer _container;
        public client(IUnityContainer container)
        {
            _container = container;
            ISpecialservice service = container.Resolve<ISpecialservice>();
            service.GetData();
        }
    }

כמובן שהקוד הזה לא תקין לפחות עד השלב הזה ,

class Program
    {
        static void Main(string[] args)
        {
            IUnityContainer MyUnity = new UnityContainer();
            MyUnity.RegisterType<ISpecialservice,Service>();
 
            Client client = new Client(MyUnity);
 
        }
    }

 

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

 

עד כאן כמבוא קצר לUnity ונרחיב בהמשך כנדבר על  Prism- WPF ,בפוסט הבא נסקור בקצרה
את  
MEF.

 

 

הוסף תגובה
facebook linkedin twitter email

Leave a Reply

Your email address will not be published. Required fields are marked *