Ich habe versucht, die Prinzipien der Dependency Injection zu folgen, aber after reading this article, I know I'm doing something wrong.Dependency Injection und Runtime Objekterstellung
Hier ist meine Situation: Meine Anwendung erhält verschiedene Arten von physischer Post. Die gesamte eingehende Mail läuft durch mein MailFunnel
Objekt.
Während es läuft, empfängt MailFunnel
verschiedene Arten von Nachrichten von außen: Box, Postkarte und Magazin.
Jeder Mail-Typ muss anders behandelt werden. Zum Beispiel, wenn eine Box kommt, muss ich möglicherweise das Gewicht vor der Auslieferung aufnehmen. Folglich habe ich BoxHandler
, PostcardHandler
und MagazineHandler
Objekte.
Jedes Mal, wenn eine neue Nachricht mein MailFunnel
kommt, instanziieren ich ein neueMailHandler
Objekt entspricht.
Zum Beispiel:
class MailFunnel { void NewMailArrived(Mail mail) { switch (mail.type) { case BOX: BoxHandler * bob = new BoxHandler(shreddingPolicy, maxWeightPolicy); bob->get_to_work(); break; case POSTCARD: PostcardHandler * frank = new PostcardHandler(coolPicturePolicy); frank->get_to_work(); break; case MAGAZINE: MagazineHandler * nancy = new MagazineHandler(censorPolicy); nancy->get_to_work(); break; } } private: MaxWeightPolcy & maxWeightPolicy; ShreddingPolicy & shreddingPolicy; CoolPicturePolicy & coolPicturePolicy; CensorPolicy & censorPolicy; }
Auf der einen Seite, das ist großartig, weil es bedeutet, dass, wenn ich fünf verschiedene Poststücke erhalten in, habe ich sofort fünf unterschiedliche MailHandlers
gleichzeitig arbeiten von Geschäft zu kümmern. Dies bedeutet aber auch, dass I'm mixing object creation with application logic - ein großes No-No, wenn es um Dependency Injection geht.
Auch habe ich alle diese Politik Referenzen herumhängen in meinem MailFunnel
Objekt, das MailFunnel
wirklich nicht benötigt. Der einzige Grund, warum MailFunnel
diese Objekte hat, besteht darin, sie an die MailHandler
Konstruktoren zu übergeben. Wiederum this is another thing I want to avoid.
Alle Empfehlungen sind willkommen. Vielen Dank!