加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 如何将参数从实例化器传递给spring4d依赖注入框架中的

发布时间:2020-12-15 10:11:27 所属栏目:大数据 来源:网络整理
导读:可以注册一个具有预期从创建点传递的参数的类吗? 我知道可以这样做: GlobalContainer.RegisterTypeTUserProcessor.ImplementsIUserUpgrader.AsTransient.DelegateTo( function: TUserProcessor begin Result := TUserProcessor.Create(GetCurrentUser); en
可以注册一个具有预期从创建点传递的参数的类吗?

我知道可以这样做:

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

但是参数被绑定到容器被注册的执行上下文,而不是对象得到实例化的位置.

这样的事情可能就是这样吗?

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

我知道一些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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读