gpt4 book ai didi

delphi - 如何将参数从实例化器传递到 spring4d 依赖注入(inject)框架中的构造函数?

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

可以使用预期从创建点传递的参数来注册一个类吗?

我知道可以这样做:

GlobalContainer.RegisterType<TUserProcessor>.Implements<IUserUpgrader>.
AsTransient.DelegateTo(
function: TUserProcessor
begin
Result := TUserProcessor.Create(GetCurrentUser);
end
);

但是参数绑定(bind)到容器注册的执行上下文,而不是实例化对象的位置。

例如,这样的事情可能吗?

GlobalContainer.Resolve<IMathService>([FCurrentUser]);

我知道有些人提倡使用非常简单的构造函数,但有时构造函数参数看起来显然是正确的方法:

  1. 构造的对象需要对象参数才能工作,因此必须满足引用。该参数还使该约束在类中更加明显。

  2. 如果您尝试在不先进行赋值的情况下使用该对象,则可以在方法或属性中分配引用,并在每个其他方法中引发和异常。我不喜欢编写这种类型的代码,这只是浪费时间,只需使用构造函数参数并检查那里即可。在我看来,代码越少越好。

  3. 此外,传递的对象对于使用容器构造新对象的对象来说是本地的(例如 Transaction 对象),并且具有某种状态(它不是我可以通过容器获取的新对象)。

最佳答案

我已经像在 Unity 中一样添加了解析器覆盖。

所以你可以写:

program Demo;

{$APPTYPE CONSOLE}

uses
Classes,
Spring.Container,
Spring.Container.Resolvers;

type
IUserUpgrader = interface
['{ADC36759-6E40-417D-B6F7-5DCADF8B9C07}']
end;

TUser = class(TObject);

TUserProcessor = class(TInterfacedObject, IUserUpgrader)
public
constructor Create(AUser: TUser);
end;

constructor TUserProcessor.Create(AUser: TUser);
begin
Writeln('called constructor with passed user');
end;

begin
GlobalContainer.RegisterType<TUserProcessor>.Implements<IUserUpgrader>;
GlobalContainer.Build;

GlobalContainer.Resolve<IUserUpgrader>(
TOrderedParametersOverride.Create([TUser.Create]));

GlobalContainer.Resolve<IUserUpgrader>(
TParameterOverride.Create('AUser', TUser.Create));

Readln;
end.

编辑2018年9月17日:

这在很久以前就发生了变化,Resolve 通过 TValue 数组 接受参数。您可以直接在那里传递值,然后这些值必须与构造函数中的参数列表完全匹配。对于仅部分填充参数,您可以使用 Spring.pas 中的 TNamedValueTTypedValue

无论如何,我建议使用由代码注入(inject)和使用的工厂,而不是进入容器(全局容器或非全局容器)Resolve 方法。

关于delphi - 如何将参数从实例化器传递到 spring4d 依赖注入(inject)框架中的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9952353/

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