2012-03-31 50 views
8

可以注册一个类,该类具有从创建点传递的参数?delphi - 如何将参数从实例化器传递给spring4d依赖注入框架中的构造函数?

我知道这是可以做到这样的事:

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

但这些参数绑定到未在对象中获取的intantiated其中容器被登记的执行上下文和。

这样的事情是可能的例如?

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

我知道有些peoble主张有非常简单的构造,但也有当一个构造函数的参数看起来显然是要走的路时间:

  1. 构造的对象需要对象参数工作,所以参考必须得到满足。该参数也使得这个约束更加明显地看着这个类。

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

  3. 此外,对象被传递给使用容器构造新对象的对象(例如一个Transaction对象)并且具有某种状态(它不是我可以通过容器获得的新对象)。

+0

我不知道'TContainer.Resolve '的接受在Spring4D数组参数的重载的。我想念什么? – menjaraz 2012-03-31 05:10:42

+0

@menjaraz这是只是和想法,它可以如何实现(肯定它可以与RTTI donde) – 2012-03-31 22:56:42

+0

好吧,这听起来像一个功能请求。为什么不把它发布到[spring4d Google Group](http://groups.google.com/group/spring4d)? – menjaraz 2012-04-01 06:17:29

回答

7

我添加了像Unity一样的resolver覆盖。

所以你可以这样写:

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. 
0

你可以看看这个线程: 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”作为名称。

相关问题