2011-10-19 26 views
2

我想向我的asp.net mvc 3控制器注入第二個存儲庫。我無法使它工作,不知道在哪裏使用Ninject「添加另一個」。MVC控制器 - 在控制器中注入2儲存庫

我在global.asa.cs

kernel.Bind<INewsRepository>().To<NewsRepository>(); 

而且在我的控制器我有一個void函數:

private INewsRepository _newsRepository; 
private IContentRepository _contentRepository; 

public NewsController(INewsRepository newsRepository, IContentRepository contentRepository) 
{ 
    this._newsRepository = newsRepository; 
    this._contentRepository = contentRepository; 
} 

如何註冊IContentRepository爲NewsController呢?

+1

你沒有爲'NewsController'聲明相關性。你聲明任何依賴於'INewsRepository'的類都使用指定的具體類。對'IContentRepository'做同樣的事情,當ninject需要創建一個'NewsController'時,它會識別出有多個依賴關係。 –

回答

3

我使用autofac而不是Ninject,但基本保持不變。

如果你有你的第一個依賴注入工作,那麼你應該能夠綁定其他人。你只需要在Global.asax的Application_Start()中添加一個新的綁定。

所以,你的第一個結合也這麼做:

kernel.Bind<IContentRepository>().To<ContentRepository>(); 

你可以有許多綁定,只要你喜歡。

+0

這就是答案,我一直都這樣......我只是沒有編譯過的變化:S –

2

首先,將應用程序的引導程序移動到一個單獨的位置是一種很好的做法。這使您的Global.asax保持清潔。

您還應該使用基於約定的註冊。它最終會爲您節省大量時間來處理不需要自定義的綁定。

因此,對於你我可能會建議以下

public static class Bootstrapper() 
{ 
    public static void Bootstrap() 
    { 
     kernel.Scan(k => 
     { 
     k.FromAssemblyContaining<INewsRepository>(); 
     k.BindWithDefaultConventions(); 
     }); 
    } 
} 

並在您的Global.asax中添加此..

Bootstrapper.Bootstrap(); 

那麼我建議你花一些時間在谷歌閱讀關於ninject約定。