0

我有三个班。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不是由容器管理的,我想将TC实例注入TB实例怎么办?不注册TB可以吗?

4

1 回答 1

1

如果 TB 是在其中创建的,TA.Create那么容器将无法访问它,除非您想公开实例以便向其中注入一些东西,但是您再次破坏了容器的目的,即处理实例创建,包括它们的依赖关系图。

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

现在你有容器知道的 TA 和 TC,但不知道 TB。

使 TB 可注入 TA,注册它,当您解析 TA 时,它将构建完整的对象图。

于 2018-04-16T11:35:58.643 回答