比方说,我有以下代码:
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中是不可能的,是吗?
发布于 2015-05-01 16:13:22
如果您想避免可怕的服务定位器模式,这种模式不能解决DI解决的问题,而只是改变它(或者在许多情况下甚至会使情况变得更糟,因为您有伪解耦代码,它仍然具有依赖关系,只有在运行代码之后才能体验到这种依赖关系,并且必须注册某种类型才能使服务定位器返回正确的内容)。
方法参数注入还是局部变量注入?那到底是怎么可能的。它需要对调用进行一些拦截,以便容器将某些内容注入寄存器/堆栈中。
虽然某些方法(虚拟方法)仍然需要为此设置被调用的实例,但是拦截是可能的。如果你这样做的话,你一开始就可以注入你的依赖性。
如果不将DI放在组合根目录中,则始终必须在代码中使用某种服务定位器,从那里开始依赖项注入过程。
考虑一下DI,特别是使用容器作为工具来实现一些特定的目标:主要是将您的代码解耦,以获得它的各种好处。正如我所说,在这种情况下使用服务定位器可能会导致更多的问题,而不是解决问题。
但是,回到您的示例:这是使用工厂的经典案例。你需要把它注入你的TMyClass1。然后,它可以在您的方法中调用工厂并检索IMyInterface2。根据您使用的Spring4D版本,容器可以为您节省一些工作,因为它能够为您构造工厂。但我建议你自己写工厂,用经典的模式。这样你就能感觉到了。稍后,当您对它的使用和使用地点更有经验和自信时,容器可以轻松地接管该部分。
https://stackoverflow.com/questions/29987670
复制相似问题