可以注册一个具有预期从创建点传递的参数的类吗?
我知道可以这样做:
GlobalContainer.RegisterType<TUserProcessor>.Implements<IUserUpgrader>.
AsTransient.DelegateTo(
function: TUserProcessor
begin
Result := TUserProcessor.Create(GetCurrentUser);
end
);
但是参数被绑定到容器被注册的执行上下文,而不是对象获取的地方。
这样的事情可能就是这样吗?
GlobalContainer.Resolve<IMathService>([FCurrentUser]);
我知道有些人提倡使用非常简单的构造函数,但有时候构造函数参数看起来很清楚:
我在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.
编辑17.09.2018:
这在很久以前就发生了变化,Resolve正在通过array of TValue
接受参数。您可以直接在那里传递值,然后必须与ctor中的参数列表完全匹配。只需部分填充参数,您可以使用Spring.pas中的TNamedValue
或TTypedValue
无论如何,我建议你的代码注入和使用工厂,而不是进入容器(全局或不是)Resolve方法。
你可以查看这个帖子:https://forums.embarcadero.com/message.jspa?messageID=440741
我在框架中对此进行了实现,并在我的代码中使用它。如果你想要它,我会发给你。请记住,当它们在代码库中添加这样的功能时,这不是它可能会如何完成的。宝泉有我的代码。
如果您尝试在没有所有必需参数的情况下进行解析,此实现也会处理,并为您提供显示缺少参数的异常。
你这样使用它:
ServiceLocator.GetService<ISomeObj>(ServiceParameters['paramname1',value1]['paramname2',value2]..);
值存储为TValue,可以是任何值。
在类中注册参数是使用以下属性完成的:
private
[ContainerParameter('paramname1')]
FYourValue1: ...;
[ContainerParameter('paramname2')]
FYourValue2: ..;
你也可以
[ContainerParameter]
FYourValue1:..
但是,您的参数名称为'FYourValue1'。