私は依存性の注入の原則に従うことをしようとしてきたが、after reading this article, I know I'm doing something wrong.依存性注入と実行時オブジェクトの作成
は、ここに私の状況です:私のアプリケーションは、物理的なメールの種類を受け取ります。すべての受信メールは私のMailFunnel
オブジェクトを通過します。
実行中、MailFunnel
は外部からさまざまな種類のメッセージを受信します:ボックス、郵便はがき、雑誌。
それぞれのメールタイプを別々に処理する必要があります。たとえば、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; }
それは私がメールの五つの異なる部分を取得する場合、私はすぐに5異なるMailHandlers
は、ビジネスの世話をするために同時に取り組んでいることを意味するので、これは素晴らしいです。しかし、これはまた、I'm mixing object creation with application logicを意味します - それは依存性注入に関しては大きなノー・ノーです。
また、MailFunnel
が本当に必要としない私のMailFunnel
オブジェクトには、これらのポリシーの参照がすべてぶら下がっています。 MailFunnel
にこれらのオブジェクトがある唯一の理由は、それらをMailHandler
コンストラクタに渡すことです。再度、this is another thing I want to avoid。
すべてのアドバイスを歓迎します。ありがとう!