Я пытался следовать принципам Dependency Injection, но after reading this article, I know I'm doing something wrong.Dependency Injection и создание объекта выполнения
Вот моя ситуация: Мое приложение получает различные виды физической почты. Вся входящая почта проходит через мой объект MailFunnel
.
Пока он работает, MailFunnel
получает различные виды сообщений извне: Box, Postcard and Magazine.
Каждый тип почты должен обрабатываться по-разному. Например, если появляется Box, мне может потребоваться записать вес до его доставки. Следовательно, у меня есть 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.
Все рекомендации приветствуются. Благодаря!