如何将对象注入未在容器中注册的类?

时间:2018-04-16 11:13:48

标签: delphi dependency-injection spring4d

我有三节课。 TA类使用TB, TB类使用TC。

在容器中我注册了TA和TC,TB不需要注册。

procedure Project;
var
    a: TA;
begin
    GlobalContainer.RegisterType<TA>.AsSingleton;
    GlobalContainer.RegisterType<TC>.AsSingleton;

    GlobalContainer.Build;
    a := GlobalContainer.Resolve<TA>;
end;

类定义:

TA = class
private
    _b: TB;
public
    constructor Create;
end;

TB = class
private
    _c: TC;
public
    procedure SetC(c: TC);
end;

TC = class
public
    data: String;
end;

constructor TA.Create;
begin
    _b := TB.Create;
end;

procedure TB.SetC(c: TC);
begin
    _c  := c;
end;

如果我想将TB实例注入TB实例,当TB不是由容器管理时,我该怎么办? 没有注册TB可以做到吗?

1 个答案:

答案 0 :(得分:1)

如果在TA.Create内部创建了TB,那么容器无法访问它,除非你想暴露实例以便向其中注入一些东西,但是你又要破坏容器的目的是处理实例创建包括他们的依赖图。

您有这些依赖关系(箭头表示“需要依赖”):TA→TB→TC

现在你已经知道了TA和TC,而不是TB。

将TB注入TA,注册它,当你解决TA时,它将构建完整的对象图。