我一直努力遵循依赖注入的原则,但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。
欢迎提供所有建议。谢谢!