2011-07-18 40 views
3

更新Ninject是具體的有關構造函數

我已經設法解決這個問題的代碼順序。現在我檢查一下自己,依賴關係是否可以解決。如果沒有,我會尋找一個無參數的構造函數(通過Reflection)並調用它。但我認爲這是Ninjects的工作份額......所以更多的解決方法不是真正的解決方案。

原始的問題

public class Test 
{ 
    public Test(INavigationService asd) 
    { 
     // rnd stuff 
    } 

    public Test() 
    { 
     // other rnd stuff 
    } 
} 

我有了這個測試類。現在,我需要Ninject創建的兩個實例。所以,我做到以下幾點:

Test test = Kernel.Get<Test>(); 

碰上一個例外: 「Ninject.ActivationException:錯誤激活INavigationService」。

如果我重新排序,這樣

public class Test 
{ 
    public Test() 
    { 
     // other rnd stuff 
    } 

    public Test(INavigationService asd) 
    { 
     // rnd stuff 
    } 
} 

它的工作原理構造。 但我無法確定,我使用Ninject的每個類的構造函數都是「正確」的順序。 那麼,有沒有辦法告訴Ninject不要忽略無參數的構造函數,如果它不是第一個?

預先感謝您。

回答

6

Ninject嘗試注入參數最多的參數(它知道如何解析*)。但是,你可以告訴Ninject明確其constructor注入:

public class Test 
{ 

    public Test(INavigationService asd) 
    { 
     // rnd stuff 
    } 

    [Inject] 
    public Test() 
    { 
     // other rnd stuff 
    } 
} 

注:你不能把Inject一個以上的構造屬性。它會拋出一個異常。

更新:這是解決這個問題的另一種方法,值得嘗試。

Bind<ITest>().ToMethod(x => factoryMethod()); factoryMethod做了兩兩件事:如果你的依賴是通過Kernel.CanResolve()或其他方式加載

  1. 檢查。
  2. 如果是,則使用參數化的ctor。如果不是,請使用無參數構造函數。

感覺俗氣,不知道這是否是一種好的模式。如果這些參數是可選的,那麼更好的做法是使用屬性注入(通常會皺眉)或者方法注入。

+0

我意識到這一點。但我希望Ninject注入到兩者中。 如果它知道INavigationService,它應該使用它。如果不是,它應該使用另一個,而不是拋出異常。 –

+0

我明白了。雖然你的問題聽起來不同。要做到這一點,你可能需要稍微等一下,看看這裏:http://www.planetgeek.ch/2011/05/28/ninject-constructor-selection-preview/。另外建議玩WithConstructorArgument()''。 – Mrchief

+0

謝謝你,我會再看看這個! –