2011-08-16 224 views
3

構建我們已經打了一個問題,我們想注入的依賴到已通過反射構造一個對象:Ninject注入對象通過反射

 Type _type = Type.GetType(className, true, true); 
     ConstructorInfo _ctor = _type.GetConstructor(new[] { typeof(MyClass) }); 
     IReg _reg = (IReg)_ctor.Invoke(new object[] { _myClass }); 

注射似乎並沒有使用在這裏發生的事情財產注入。這不可能嗎?我們如何解決這個問題? 謝謝。

回答

1

通過IKernel上的kernel.Inject(Object)方法進行反射構建後,可以在對象上進行屬性注入。但是這將是後期建設,你不會得到任何構造注入。

+0

這似乎是迄今爲止最好的方式。但是,我如何到達我的內核?創建一個新的?它在Web服務應用程序級別實例化(我們使用WCF擴展)。與綁定一起。我們的實例化邏輯在業務邏輯級別(不同的程序集)執行,它不知道它被Web服務使用。 – KirEvse

+0

依賴注入模式是「經典抽象類工廠」+新特性(基於ctor/properties,對象生命週期...的接線依賴性)的泛化。因此它應該像抽象類工廠一樣使用:在安裝應用程序(例如:* main * function)中,您應該定義「類工廠」並將其作爲抽象傳遞給組件(例如:業務邏輯組件)。在我們的例子中,抽象類工廠是IKernel。如何將內核傳遞給你的程序集?將每個呼叫的實例傳遞給需要的業務。或者在您的業務邏輯程序集中爲其定義一個單例。 –

+0

你將不得不找出一些方法來獲取內核。看看這個問題的遺留系統的一些想法http://stackoverflow.com/q/6562872/154477 – ryber

0

要使用依賴注入框架,您不應該使用new或reflection來自己實例化對象,而應該調用注入框架。 你的情況:

//setup the application 
IKernel kernel = new StandardKernel(); 
//add all your other bindings for property injection 
... 

kernel.Bind<MyClass>.ToConstant(_myClass); //if same _myClass instance is used than this can go in setup application. 
Type _type = Type.GetType(className, true, true); 
var _reg = kernel.Get(_type); 
kernel.Unbind<MyClass>(); //cleanup the global kernel 

任何方式依賴注入框架用於避免使用用於對象實例化+佈線反射它的依存關係,基於先前的配置(使用Ninject 綁定呼叫)。

+0

不幸的是,大約有100多個類實現了這個接口。這些類的名稱是動態檢索的,結果也是動態實例化的(參見上面的示例)。哪些類需要實例化是依賴於業務邏輯的,並且將很難重構。 – KirEvse

0

有一個Kernel.Get(Type),但是因爲你想調用一個特定的構造函數,所以沒用。有一個可定製的構造函數選擇策略,您可以使用它來模擬您在第二行中執行的操作。