gpt4 book ai didi

c++ - 依赖注入(inject)和运行时对象创建

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:06:00 25 4
gpt4 key购买 nike

我一直在尝试遵循依赖注入(inject)的原则,但是 after reading this article, I know I'm doing something wrong.

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

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

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

每次有新消息进入我的MailFunnel,我都会实例化一个new 对应的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 - 当涉及到依赖注入(inject)时,这是一个很大的禁忌。

另外,我的 MailFunnel 对象中有所有这些策略引用,而 MailFunnel 确实不需要。 MailFunnel 拥有这些对象的唯一原因是将它们传递给 MailHandler 构造函数。同样,this is another thing I want to avoid .

欢迎所有建议。谢谢!

最佳答案

在我看来,这更像是一个工厂。将 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();
}
}

关于c++ - 依赖注入(inject)和运行时对象创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/613131/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com