delphi 带MVP的spring4D依赖项注入器

qco9c6ql  于 2022-12-12  发布在  Spring
关注(0)|答案(1)|浏览(99)

我在组织为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;

谢谢
我设想将对象的现有示例声明为单例将被注入,而不是创建一个新示例,

bfnvny8b

bfnvny8b1#

问题是你做的服务位置是一个不同于最初创建视图的解析链。这会导致另一个没有标记为单例的TConversorService的创建。设计你的代码就像你在做纯粹的DI --在没有正确设计的情况下修补DI容器,然后将服务位置填充到你的代码中总是会导致问题。
如果你需要一个对你的IConversorService的反向引用,这个引用位于注入到你的IConversorService中的视图中,那么最简单的方法就是在你的视图中放置一个属性,这个属性可以在TConversorService.Create中设置。

相关问题