gpt4 book ai didi

delphi - Spring4d : Automatic factory with Owner : TComponent parameter?

转载 作者:行者123 更新时间:2023-12-03 15:54:07 25 4
gpt4 key购买 nike

Spring4d ,你可以像这样注册自定义工厂

aContainer.RegisterInstance<TFunc<string, TMyObject>>(function(aName : string):TMyObject
begin
Result := TMyObject.Create(aName);
end);

通过这种方式,我相信对于从 TComponent 继承的每个依赖项,想要超越所有者的人要么这样做

// Registrations 

aContainer.RegisterInstance<TFunc<TComponent, TMyObject>>(function(Owner : TComponent):TMyObject
begin
Result := TMyObject.Create(Owner);
end);

// Then in code

constructor TMyClass.Create(aFctry : TFunc<TComponent, TMyObject>);
begin
fObj := aFctry(Self);
end;

或者也可以这样做

aContainer.RegisterType<TMyObject, TMyObject>;

// In code

constructor TMyClass.Create(aObj : TMyObject);
begin
fObj := aObj;
InsertComponent(aObj);
end;

不过,这很容易出错/添加代码只是为了传递所有者。是否有一种内置方法可以获取以 TComponent 作为参数的工厂,而无需事先在容器中注册它?

因为我经常会用到

constructor MyObject.Create(aDep : TFunc<TMyDep>);

未注册 TFunc<TMyDep>依赖项,但仅限 TMyDep类型。

是否可以传递类似的内容

constructor MyObject.Create(aDep : TFunc<TComponent, TMyDep>);

无需在容器中注册它?

最佳答案

据我所知,如果没有注册,这是不可能的。

但是,有一种方法可以使用不同的 IFactory<T,TResult> 来摆脱 1-4 个参数的手动工厂实现。接口(interface)来自 Spring.Container.Common ,注册后将由 DI 容器自动实现。

所以你可以这样注册:

aContainer.RegisterType<TMyObject>;
aContainer.RegisterType<IFactory<TComponent, TMyObject>>.AsFactory;

像这样注册工厂,不需要您自己实现 - 容器将为您解决它。

这意味着,每当您需要 TMyObject 的实例时,您不再直接请求它(从容器)。相反,您确实请求 IFactory<TComponent, TMyObject> 的实例,其中TComponentTMyObject 接受的唯一参数构造函数。

作为从另一个类注入(inject)构造函数的示例 TSomeClass ,(其中 TSomeClass 也是 TComponent 后代)它看起来像下面这样:

constructor TSomeClass.Create(const AMyObjectFactory: IFactory<TComponent, TMyObject>);
begin
fMyObjectInstance := AMyObjectFactory(Self);
end;

至少对我来说,这让事情变得容易多了。

关于delphi - Spring4d : Automatic factory with Owner : TComponent parameter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34280951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com