Delphi spring4d解析本地构造的类

Delphi spring4d解析本地构造的类,delphi,spring4d,Delphi,Spring4d,比方说,我有以下代码: interface type IMyInterface1 = interface // GUID procedure ButtonEvent(Sender: TObject); end; IMyInterface2 = interface // GUID procedure DoSomething; end;

比方说,我有以下代码:

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.
接口
类型
IMyInterface1=接口//GUID
程序按钮事件(发送方:ToObject);
结束;
IMyInterface2=接口//GUID
程序剂量测定;
结束;
TMyClass1=类(TInterfacedObject,IMyInterface1)
公众的
程序按钮事件(发送方:ToObject);
结束;
TMyClass2=类(TInterfacedObject,IMyInterface2)
公开的
程序剂量测定;
结束;
// ...
实施
程序TMyClass1.按钮事件(发送方:TObject);
变量
aIntf2:TMY接口2;
开始
//伪代码:
//aIntf2:=ServiceLocator.GetService;
尝试
2.DoSomething;
最后
aIntf2:=nil;//将释放实例。。。
结束;
结束;
初始化
//伪代码:
//全球集装箱寄存器IMyInterface1/TMyClass1
//全球集装箱寄存器IMyInterface2/TMyClass2
//环球集装箱,建造
结束。
方法ButtonEvent由delphi表单按钮单击事件调用

现在我的问题是: 有没有更好的方法来实例化类TMyClass2? 在我的例子中,不可能注入类TMyClass1,TMyClass2实例的生存期仅在ButtonEvent内部。 下一次对ButtonEvent的调用应使用不同的实例


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

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

方法参数注入还是局部变量注入?这到底是怎么可能的。为了让容器向寄存器/堆栈中注入一些东西,需要对调用进行一些拦截

虽然某些方法(虚拟方法)仍然需要为其设置被调用的实例,但拦截是可能的。如果你这样做,你可以首先注入依赖项

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

想想DI,尤其是使用容器作为工具来实现一些特定的功能:主要是为了实现代码的各种好处而解耦代码。正如我所说,在这种情况下使用服务定位器可能会导致比解决问题更多的问题


然而,回到您的示例:这是使用工厂的典型案例。您需要将其注入TMyClass1。然后它可以在您的方法中调用工厂并检索IMyInterface2。根据您使用的Spring4D版本,容器可以通过不同的方式为您节省一些工作,因为它能够构建工厂对你来说。但我建议你自己用经典模式来编写工厂。这样你会对它有感觉。以后当你对它的使用更有经验和信心时,在哪里使用容器可以很容易地接管该零件。

好的……现在我明白了……工厂是一个很好的解决方案。我们的方法或参数注入呢像java spring那样使用代理?这样面向方面的编程也有可能有一天……请访问我们的论坛(项目页面上的链接)我不认为这种讨论可以也不应该在这里进行。正如我所看到的,Spring容器有一个注册工厂的方法:TContainer.RegisterFactory 1。有没有一个例子说明如何使用它?2.我能让spring4d进行注入吗对于考虑因素的实例?