首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >spring4d解析本地构造的类

spring4d解析本地构造的类
EN

Stack Overflow用户
提问于 2015-05-01 13:23:52
回答 1查看 660关注 0票数 0

比方说,我有以下代码:

代码语言:javascript
复制
interface
        type 
          IMyInterface1 = interface // GUID
            procedure ButtonEvent(Sender: TObject);
          end;

          IMyInterface2 = interface // GUID
            procedure DoSomething;
          end;

          TMyClass1 = class(TInterfacedObject, IMyInterface1)
          public
            procedure ButtonEvent(Sender: TObject);
          end;

          TMyClass2 = class(TInterfacedObject, IMyInterface2)
          public 
            procedure DoSomething;
          end;

// ...
implementation        
        procedure TMyClass1.ButtonEvent(Sender: TObject);
        var
          aIntf2: TMyInterface2;
        begin
          // Pseudo code:
          // aIntf2 := ServiceLocator.GetService<IMyInterface2>;
          try
            aIntf2.DoSomething;
          finally
            aIntf2 := nil; // will free the instance...
          end;
        end;

    initialization
      // Pseudo code:
      // GlobalContainer register IMyInterface1 / TMyClass1
      // GlobalContainer register IMyInterface2 / TMyClass2
      // GlobalContainer.Build
    end.

方法ButtonEvent是通过delphi按钮单击事件调用的。

现在我的问题是:是否有更好的方法来实例化类TMyClass2?在我的示例中,不可能向类TMyClass1注入,TMyClass2实例的生存期仅在ButtonEvent中。下一个对ButtonEvent的调用应该使用不同的实例..。

方法参数注入或局部变量注入在Spring4D中是不可能的,是吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-01 16:13:22

如果您想避免可怕的服务定位器模式,这种模式不能解决DI解决的问题,而只是改变它(或者在许多情况下甚至会使情况变得更糟,因为您有伪解耦代码,它仍然具有依赖关系,只有在运行代码之后才能体验到这种依赖关系,并且必须注册某种类型才能使服务定位器返回正确的内容)。

方法参数注入还是局部变量注入?那到底是怎么可能的。它需要对调用进行一些拦截,以便容器将某些内容注入寄存器/堆栈中。

虽然某些方法(虚拟方法)仍然需要为此设置被调用的实例,但是拦截是可能的。如果你这样做的话,你一开始就可以注入你的依赖性。

如果不将DI放在组合根目录中,则始终必须在代码中使用某种服务定位器,从那里开始依赖项注入过程。

考虑一下DI,特别是使用容器作为工具来实现一些特定的目标:主要是将您的代码解耦,以获得它的各种好处。正如我所说,在这种情况下使用服务定位器可能会导致更多的问题,而不是解决问题。

但是,回到您的示例:这是使用工厂的经典案例。你需要把它注入你的TMyClass1。然后,它可以在您的方法中调用工厂并检索IMyInterface2。根据您使用的Spring4D版本,容器可以为您节省一些工作,因为它能够为您构造工厂。但我建议你自己写工厂,用经典的模式。这样你就能感觉到了。稍后,当您对它的使用和使用地点更有经验和自信时,容器可以轻松地接管该部分。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29987670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档