2014-07-18 98 views
0

我一直在ASP.NET Web API中使用Ninject大約一個月,並且有一個很好的體驗。但是,我有一個反覆出現的問題,我尚未找到任何令人滿意的解決方案。如何解決'無參數構造'

任何時候如果將控件返回給ASP.NET解析器,Ninject會在實例化依賴關係鏈中的任何對象時出現問題。當然,ASP.NET抱怨沒有無參數的構造函數。

是否有任何方法從Ninject獲取有關底層故障的信息,甚至是無法創建哪個對象的信息。

我想我可能有辦法記錄內部行爲,但無法找到任何信息。

感謝

+0

添加一個沒有參數的構造函數 – meda

+0

@meda我可以做到這一點,但我會有我的控制器沒有它的依賴關係的實例。這有用嗎? –

回答

1

我不太瞭解ASP.Net,但我知道一件事或兩件關於ninject。 因此,如果我收集正確,你的問題是,每當ninject無法解決請求時,控制權將返回給框架,然後嘗試實例化該類型 - 並失敗,並指出要解析的類型缺少無參數構造函數。 這是不令人滿意的,因爲很難確定哪個綁定不正確/失敗。

爲了收集更多的信息,我建議你重寫粘貼代碼,將解析請求傳遞給ninject。 而不是IResolutionRoot.TryGet<>方法使用IResolutionRoot.TryGetAndThrowOnInvalidBinding<>()方法。如果存在綁定,則此方法將引發異常,但ninject無法解析它。 ninject的IResolutionRoot.TryGet<>吞下這類問題。

現在,如果沒有顯式綁定,ninject仍然會返回null,並且ASp.Net框架仍然會拋出一個異常,指出沒有缺少無參數的構造函數。我建議應該有關於它試圖解決異常的類型的信息。如果不是這種情況,您可以更改ninject-glue-code來記錄它無法解析的所有請求。 然後,您應該爲所有這些創建顯式綁定,以便您可以逐步縮小範圍。

編輯: 如果您打算明確定義所有綁定/您已經這樣做了,請嘗試IResolutionRoot.Get<>() - 不要嘗試。無論何時無法解析類型,這總是會導致NinjectException。這個例外會告訴你更多關於爲什麼會發生。

另請參閱Are controller factories neccessary when using Ninject in ASP.NET mvc 4關於如何編寫自己的膠水代碼。

0

這是因爲你沒有在Ninject明確註冊你的MVC控制器。欲瞭解更多信息,請閱讀this answer。儘管該答案與Web API有關,但MVC在這方面表現相同。

+0

謝謝。對另一個答案的回答是有趣的閱讀,並對ASP.NET如何與DI框架進行交互有一定的瞭解。但是,明確註冊我的控制器並沒有使Ninject提供任何有用的信息。我仍然只是得到相對無意義的「無參數構造函數」例外。 –