2012-03-31 91 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」作爲名稱。

相關問題