2013-01-14 45 views
0

只是重新標題,這是web表單而不是mvc。它也使用vb.net。在Web表單中使用Ninject使用Ninject的「參數未指定參數」

我已經使用nuget將ninject.web添加到我的項目中。我已經配置NinjectWebCommon的「RegisterServices」方法如下:

Private Shared Sub RegisterServices(kernel As IKernel) 
    kernel.Bind(Of ilbdUOW)().[To](Of lbdUOW)() 
End Sub 

一切都編譯乾淨。當我運行簡單的Web窗體(.aspx頁面,沒有母版頁),我收到以下錯誤:

BC30455: Argument not specified for parameter '_uow' of 'Public Sub New(_uow As lbD.data.lbdUOW)'. 

而且這點在編譯的代碼到線52:

Line 51:   Public Sub New() 
Line 52:    MyBase.New 
Line 53:    Dim dependencies() As String 

其中(我相信)來自在.aspx頁面的頂部,當編譯,在那裏我有「新」的構造函數下面的代碼:

<Inject()> _ 
Public Sub New(_uow As ilbdUOW) 
    Uow = _uow 
End Sub 

(當然,我說的「我相信」,但我知道這是因爲如果我從interfa中更改「ilbdUOW」 CE到類的「lbdUOW」這相應地更改錯誤信息,這樣肯定是在那裏的來自)

如果我戴上了「UOW = _uow」線調試停在我的「新」的構造,也另調試停止在NinjectWebCommon文件中的「RegisterServices」方法中,調試器僅在「RegisterServices」調試點停止,並且永遠不會進入主.aspx頁面中的調試停止。

我現在完全失去了。我試圖讓我的腦袋圍繞對我而言相對較新的事物,我認爲我幾乎到了那裏。我的理解是,NinjectWebCommon中的「RegisterServices」中的代碼將認識到,當我在構造函數中引用它時(例如我的.aspx頁面中的「新」構造函數),我需要一個「ilbdUOW」接口實例,並且將自動注入它,從而使工作實例的單元可用於訪問數據庫。

如果任何人都可以指出我在正確的方向,我會非常感激,謝謝。

編輯補充: @ mipe34

沒有對「新」的構造,沒有:

Public Sub New(ByVal repositoryProvider As IRepositoryProvider) 
    MyBase.New() 
    CreateDbContext() 
    repositoryProvider.DbContext = DbContext 
    _RepositoryProvider = repositoryProvider 
End Sub 

我還成立了「RegisterServices」部分這些接口也映射,但它對這些額外映射是否存在或不存在的錯誤沒有影響,在我達到這一點之前似乎失敗了。

我曾在進出「RegisterServices」部分的這些線,它沒有什麼區別:

kernel.Bind(Of RepositoryFactories)().[To](Of RepositoryFactories)().InSingletonScope() 
    kernel.Bind(Of IRepositoryProvider)().[To](Of RepositoryProvider)() 
+0

'lbdUOW'是否有無參數的構造函數? – mipe34

+0

作爲註釋編輯的主要問題不允許格式化。 – TheMook

+0

泛型異常表示您沒有爲構造函數提供必需的參數。在我看來,Ninject迄今並沒有參與其中。嘗試檢查這些示例http://stackoverflow.com/questions/4933695/how-can-i-implement-ninject-or-di-on-asp-net-web-forms如果你已經完成了所有需要的步驟。 – mipe34

回答

2

的WebForm由ASP.NET創建不Ninject不能在Web窗體使用構造函數注入。您必須改爲執行屬性注入。

+0

謝謝雷莫。你有一個這樣的例子的鏈接,因爲我是ninject的新手,我不知道如何做到這一點。 – TheMook

+0

只需在頁面上創建'lbdUOW'屬性並在其上放置'[Inject]'屬性 - 並將其從構造函數中移除。如果你讀過這篇文章(http://stackoverflow.com/questions/4933695/how-can-i-implement-ninject-or-di-on-asp-net-web-forms)那麼你會發現它們是使用屬性注入而不是構造器注入。 ;-) – mipe34

+0

你說得對,對不起。這是凌晨,這對我來說都是如此新鮮,以至於我沒有直截了當地想。我一直在類和頁面之間切換,甚至沒有意識到我將一個「new()」構造函數複製到一個Web窗體中!現在已經用一個帶有[inject]屬性的公共屬性取代了它,並且所有工作都很有用,非常感謝。一個非常有用的文章,我瞭解這一切的工作方式,並可能有助於其他新手在這裏:http://www.codetunnel.com/blog/post/58/how-to-implement-proper-separation-of -concerns - 在你的web的表單應用程序 – TheMook