Depndency Injection

25 בOctober 2012

2 תגובות

 

Dependency Injection או  “הזרקת 
תלות\התנהגות” היא תבנית שיומושית מאוד,

משתמשים בה ביום יום גם בלי ההכרות עם ההגדרה המקצועית.

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

מה המימוש ומה עושה הקוד החיצוני, כל שנצרך הוא החזקת רפרנס
לאינטרפייס(חוזה)

מהסוג המבוקש והפעלת הפונקציה\ות  שלו.

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

 

נחשוב על דוגמא שימושית:

א.     
אני בונה
ממשק כניסה בסיסי למערכת בנקאית.

ב.     
אני רוצה
לבצע כניסה ברמות גישה שונות בהתאם למשתמש.

ג.      
נפשט את
זה לרמה של פקיד רגיל ומנהל.

ד.     
מסך
הכניסה שלי זהה לכולם.

ה.     
מערכת
אימות הסיסמאות (
bankWorkerGenerator בדוגמא) תבדוק את הסיסמא
ותחזיר בהתאם מופע של עובד\מנהל, שוב כדי לפשט עניינים נניח שהסיסמא היא
manager\ worker.

כיון ששניהם מהווים מימוש של חוזה  IBankWorkerInjection , מסך הכניסה יפעיל בכל אחד את
הפונקציה
logOn בלי לדעת מה המימוש.

public interface IBankWorkerInjection
    {
        void LogIn();
    }
 
    public class BankManager : IBankWorkerInjection
    {
        public void LogIn()
        {
           //goes to managment screen...
        }
    }
    public class RegularBankEorker : IBankWorkerInjection
    {
        public void LogIn()
        {
           //goes to basic operations screen
        }
    }
 
    public class bankWorkerGenerator
    {
        public IBankWorkerInjection getInstance(string password)
        {
            switch (password)
            {
                case "manager":
                    {
                        return new BankManager();
                    }
                case "worker":
                    {
                        return new RegularBankEorker();
                    }
                default:
                    return null;
            }
        }
 }
    class Program
    {
        static IBankWorkerInjection worker;
        static string password; 
        static bankWorkerGenerator generator = new bankWorkerGenerator();
        public static void StartLogIn()
        {
            worker = generator.getInstance(password);
            worker.LogIn();
        }
   
        static void Main(string[] args)
        {
            password = Console.ReadLine();
            StartLogIn();
        }
    }

 

זהו ! ביצענו הזרקת התנהגות שונה לתוך
אובייקט קיים.

סביבות עבודה כוללת היום מספר API שיודעים לנהל תוך רישום חוזים ומימושים שונים

כך שלא נצטרך ליצור אובייקטים בעצמינו.

לדוגמא MEF  Unity, .

 

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

Leave a Reply

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

2 תגובות

  1. Gadi Berqowitz25 בOctober 2012 ב 12:21

    אני דווקא הייתי ממליץ על Unity.

    זה קל , נוח , ונותן לך DI אמיתי שניתן לקנפוג חיצוני בלי צורך לעשות שינוי קוד.

    מעולה ל- Unit Testing , Mocks וכו’.

    Reply
    1. יוסי10 בJanuary 2014 ב 19:49

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

      Reply