Знам, че този въпрос е стар, но бих искал да добавя моите пет цента,
Мисля, че инжектирането на зависимости (DI) е в много отношения като конфигурируем фабричен модел (FP) и в този смисъл всичко, което можете да направите с DI, ще можете да го направите с такава фабрика.
Всъщност, ако използвате spring например, имате възможност за автоматично свързване на ресурси (DI) или да направите нещо подобно:
MyBean mb = ctx.getBean("myBean");
И след това използвайте този екземпляр „mb“, за да направите каквото и да било. Това не е ли обаждане до фабрика, която ще ти върне екземпляр??
Единствената реална разлика, която забелязвам между повечето FP примери е, че можете да конфигурирате какво е "myBean" в xml или в друг клас и рамката ще работи като фабрика, но освен това е едно и също нещо и вие със сигурност може да има фабрика, която чете конфигурационен файл или получава изпълнението според нуждите си.
И ако ме попитате за моето мнение (и знам, че не сте го направили), аз вярвам, че DI прави същото, но само добавя повече сложност към разработката, защо?
добре, от една страна, за да знаете каква е имплементацията, използвана за всеки bean, който свързвате автоматично с DI, трябва да отидете до самата конфигурация.
но... какво ще кажете за това обещание, че няма да се налага да знаете изпълнението на обекта, който използвате? пффт! сериозно? когато използвате подход като този... не сте ли същият, който пише изпълнението?? и дори да не го направите, не гледате ли почти през цялото време как изпълнението прави това, което трябва да прави??
и за последно нещо, няма значение колко много ви обещава една DI рамка, че ще изградите неща отделени от нея, без зависимости от техните класове, ако използвате рамка, вие изграждате всичко около нея, ако трябва да промените подхода или рамката, това няма да е лесна задача... НИКОГА!... но тъй като изграждате всичко около това конкретна рамка, вместо да се тревожите кое е най-доброто решение за вашия бизнес, тогава ще се сблъскате с огромен проблем, когато правите това.
Всъщност единственото реално бизнес приложение за FP или DI подход, което виждам, е ако трябва да промените реализациите, използвани по време на изпълнение, но поне рамките, които познавам, не ви позволяват направете това, трябва да оставите всичко перфектно в конфигурацията по време на разработка и ако имате нужда от това, използвайте друг подход.
Така че, ако имам клас, който се представя по различен начин в два обхвата в едно и също приложение (да речем, две компании от холдинг), трябва да конфигурирам рамката, за да създам два различни зърна, и да адаптирам кода си, за да използва всеки от тях. Не е ли същото като ако просто напиша нещо подобно:
MyBean mb = MyBeanForEntreprise1(); //In the classes of the first enterprise
MyBean mb = MyBeanForEntreprise2(); //In the classes of the second enterprise
същото като това:
@Autowired MyBean mbForEnterprise1; //In the classes of the first enterprise
@Autowired MyBean mbForEnterprise2; //In the classes of the second enterprise
И този:
MyBean mb = (MyBean)MyFactory.get("myBeanForEntreprise1"); //In the classes of the first enterprise
MyBean mb = (MyBean)MyFactory.get("myBeanForEntreprise2"); //In the classes of the second enterprise
Във всеки случай ще трябва да промените нещо във вашето приложение, независимо дали класове или конфигурационни файлове, но ще трябва да го направите, като го преразпределите.
Не би ли било хубаво да направим нещо подобно:
MyBean mb = (MyBean)MyFactory.get("mb");
И по този начин вие задавате кода на фабриката, за да получите правилната реализация по време на изпълнение в зависимост от вписаното потребителско предприятие?? Сега ТОВА би било полезно. Можете просто да добавите нов буркан с новите класове и да зададете правилата може би дори по време на изпълнение (или да добавите нов конфигурационен файл, ако оставите тази опция отворена), без промени в съществуващите класове. Това ще бъде динамична фабрика!
няма ли да е по-полезно, отколкото да се налага да пишете две конфигурации за всяко предприятие и може би дори да имате две различни приложения за всяко??
Можете да ми кажете, че никога не е необходимо да правя превключване по време на изпълнение, така че конфигурирам приложението и ако наследя класа или използвам друга реализация, просто променям конфигурацията и преразпределям. Добре, това може да се направи и с фабрика. И бъди честен, колко пъти правиш това? може би само когато имате приложение, което ще се използва някъде другаде във вашата компания, и вие ще предадете кода на друг екип и те ще правят неща като тези. Но хей, това може да се направи и с фабриката и би било още по-добре с динамична фабрика!!
Както и да е, разделът за коментари е отворен, за да ме убиете.
person
Community
schedule
13.09.2012