当前位置:  开发笔记 > 编程语言 > 正文

依赖注入和运行时对象创建

如何解决《依赖注入和运行时对象创建》经验,为你挑选了1个好方法。

我一直在尝试遵循依赖注入的原则,但在阅读本文后,我知道我做错了什么.

这是我的情况:我的应用程序收到不同类型的物理邮件.所有传入的邮件都通过我的MailFunnel对象.

在它运行时,MailFunnel从外部接收不同类型的消息:Box,Postcard和Magazine.

每种邮件类型都需要以不同方式处理.例如,如果Box进来,我可能需要在交付之前记录重量.因此,我有BoxHandler,PostcardHandlerMagazineHandler对象.

每次有新消息进入我的时候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工作同时处理业务.但是,这也意味着我正在将对象创建与应用程序逻辑混合 - 当涉及到依赖注入时,这是一个很大的禁忌.

此外,我所有这些政策参考都悬挂在我真正不需要的MailFunnel对象中MailFunnel.MailFunnel拥有这些对象的唯一原因是将它们传递给MailHandler构造函数.同样, 这是我想要避免的另一件事.

欢迎所有建议.谢谢!



1> tvanfosson..:

这看起来更像是我的工厂.将get_to_work()方法的调用移出调用并返回处理程序.该模式适用于工厂.

class MailHandlerFactory
{
  IMailHandler*  GetHandler( Mail mail )
  {
    switch (mail.type)
    {
      case BOX:
        return new BoxHandler(shreddingPolicy, maxWeightPolicy);
        break;

      case POSTCARD:
        return new PostcardHandler(coolPicturePolicy);
        break;

      case MAGAZINE:
        return new MagazineHandler(censorPolicy);
        break;
    }
  }

  private:
    MaxWeightPolcy & maxWeightPolicy;
    ShreddingPolicy & shreddingPolicy;
    CoolPicturePolicy & coolPicturePolicy;
    CensorPolicy & censorPolicy;
}

class MailFunnel
{
    MailHandlerFactory* handlerFactory;

    MailFunnel( MailHandlerFactory* factory ) {
        handlerFactory = factory;
    }

    void NewMailArrived( Mail mail ) {
        IMailHandler handler = handlerFactory.GetHandler(mail);
        handler.get_to_work();
    }
}

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有