pra*_*mer 8 delphi dependency-injection delphi-xe2 spring4d
可以注册一个具有预期从创建点传递的参数的类吗?
我知道可以这样做:
GlobalContainer.RegisterType<TUserProcessor>.Implements<IUserUpgrader>.
AsTransient.DelegateTo(
function: TUserProcessor
begin
Result := TUserProcessor.Create(GetCurrentUser);
end
);
Run Code Online (Sandbox Code Playgroud)
但是参数被绑定到容器被注册的执行上下文,而不是对象获取的地方.
这样的事情可能就是这样吗?
GlobalContainer.Resolve<IMathService>([FCurrentUser]);
Run Code Online (Sandbox Code Playgroud)
我知道一些peoble的拥护者拥有非常简单的构造函数,但有时候构造函数参数看起来很清楚:
构造的对象需要使用object参数,因此必须满足引用.该参数还使得该约束在类中更加明显.
你可以在方法或属性中分配引用,如果在没有先完成赋值的情况下尝试使用该对象,则可以在每个其他方法中引发和异常.我不喜欢编写这种类型的代码,这只是浪费时间,只是使用构造函数参数并检查那里.代码越少,IMO越好.
此外,对象被传递给使用容器(例如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.
Run Code Online (Sandbox Code Playgroud)
编辑17.09.2018:
这种情况在很久以前发生了变化,Resolve正在通过接受参数array of TValue
.您可以直接在那里传递值,然后必须与ctor中的参数列表完全匹配.仅部分填充您可以使用的参数TNamedValue
或TTypedValue
来自Spring.pas
无论如何,我建议你的代码注入和使用工厂,而不是进入容器(全局或不是)Resolve方法.
归档时间: |
|
查看次数: |
1544 次 |
最近记录: |