我一直努力遵循依賴注入的原則,但after reading this article, I know I'm doing something wrong.依賴注入和運行時創建對象
這裏是我的情況:我的應用程序接收到不同類型的物理郵件。所有收到的郵件都會通過我的MailFunnel
對象。
當它運行時,MailFunnel
接收來自外部的不同類型的消息:框,明信片和雜誌。
每種郵件類型需要以不同的方式處理。例如,如果箱子進來,我可能需要在交付之前記錄重量。因此,我有BoxHandler
,PostcardHandler
和MagazineHandler
對象。
每次有新消息進入我的MailFunnel
,我都會實例化一個新的對應的MailHandler
對象。
例如:
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; }
一方面,這是偉大的,因爲這意味着,如果我得到五個不同封郵件,我立刻有五種不同的MailHandlers
同時工作,照顧生意。但是,這也意味着I'm mixing object creation with application logic - 在依賴注入方面,這是一個很大的難題。
此外,我所有這些政策參考掛在MailFunnel
對象MailFunnel
真的不需要。 MailFunnel
具有這些對象的唯一原因是將它們傳遞給構造函數MailHandler
。再次,this is another thing I want to avoid。
歡迎提供所有建議。謝謝!