我在组织为MVP的东西中使用Spring4D的依赖注入器,在我的视图中,我有我的演示者的接口引用,在演示者的create方法中,我在构造函数中有视图接口的注入,视图被注册为单例,但是,当创建和解析演示者时,视图被再次创建并进入循环,是否可以使用Spring4D做到这一点?
procedure RegisterTypes(const Container: TContainer);
begin
Container.RegisterType<TConexao>.asSingleton;
Container.RegisterType<TConversorService>;
Container.RegisterType<TfrmConversorView>.AsSingleton();
Container.RegisterType<TConversorUseCase>;
container.Build;
end;
我的检视(表单)
type
TfrmConversorView = class(TForm, IConversorView)
JvStatusBar1: TJvStatusBar;
procedure FormShow(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
FService: IConversorService;
{ Private declarations }
public
{ Public declarations }
end;
...
procedure TfrmConversorView.FormCreate(Sender: TObject);
begin
FService := GlobalContainer.Resolve<IConversorService>;
end;
我的演示者
Type
TConversorService = Class(TInterfacedObject, IConversorService)
Private
FView: IConversorView;
FUseCase: IConversorUseCase;
Public
Constructor Create(aView: IConversorView; aUseCase: IConversorUseCase);
End;
implementation
{ TConversorService }
Constructor TConversorService.Create(aView: IConversorView; aUseCase: IConversorUseCase);
begin
FView := aView;
FUseCase := aUseCase;
end;
谢谢
我设想将对象的现有示例声明为单例将被注入,而不是创建一个新示例,
1条答案
按热度按时间bfnvny8b1#
问题是你做的服务位置是一个不同于最初创建视图的解析链。这会导致另一个没有标记为单例的
TConversorService
的创建。设计你的代码就像你在做纯粹的DI --在没有正确设计的情况下修补DI容器,然后将服务位置填充到你的代码中总是会导致问题。如果你需要一个对你的
IConversorService
的反向引用,这个引用位于注入到你的IConversorService
中的视图中,那么最简单的方法就是在你的视图中放置一个属性,这个属性可以在TConversorService.Create
中设置。