0

我在學習ASP.Net MVC。我指的是亞當弗里曼的書Pro Asp.Net MVC 4。我遇到了一個主題名Building Loosely Couple App依賴注入我沒有得到它的實際情況,所以我試圖寫他的例子的捷徑。嘗試運行依賴項注入時的空引用異常

我創建了一個接口IReservation如下

public interface IReservation 
    { 
     string getName(); 
    } 

,並實現它,如下

public class Reservation:IReservation 
    { 

     public string getName() 
     { 
      return "Wooww... It worked :D "; 
     } 
    } 

然後我通過接口的對象到我的控制器構造相同的書類。我控制器代碼如下

public class HomeController : Controller 
    { 
     IReservation res; 
     public HomeController(IReservation reservation) 
     { 
      res = reservation; 
     } 
     public HomeController() { } 
     public ActionResult Index() 
     { 
      string me = res.getName(); 
      return View(); 
     } 
} 

調試時,我在網上string me = res.getName();越來越NullReferenceException。我相信它是因爲我沒有使用new關鍵字創建它的實例,但我不確定。我是否在這裏,如果是的話,那麼這個例子可以如何糾正?我在Models文件夾中有接口和實現類。

+1

親愛的downvoter。!讓我知道缺乏DI知識,但至少要學習DI並將我指向這個副本的原件:P:D如果你找不到那個,請保持你的downvote活着,但刪除你的參考。 – Imad

+0

我建議你閱讀Mark Seemann的書[.NET中的依賴注入](http://www.manning.com/seemann/) - 這是學習DI的很好的資源。 – NightOwl888

回答

4

您應該刪除您的控制器的默認構造函數這是從來沒有注入任何IReservation例如:

public HomeController() { } 

現在你的控制器定義變爲:

public class HomeController : Controller 
{ 
    private readonly IReservation reservation; 
    public HomeController(IReservation reservation) 
    { 
     this.reservation = reservation; 
    } 

    public ActionResult Index() 
    { 
     string me = this.reservation.getName(); 
     return View(); 
    } 
} 

所有這一切,現在剩下的就是引導和配置您最喜愛的DI框架,以便在控制器中注入適當的IReservation實例。

例如,如果你在你的引導使用Ninject.MVC

kernel.Bind<IReservation>.To<Reservation>(); 

如果您使用的是一些其他的DI容器自舉應用程序時,你顯然應該適應的語法,並註冊了正確的實例。

+0

我最初沒有默認構造函數,但它在運行時拋出了'沒有爲此對象定義的無參數構造函數。所以我用了。 – Imad

+0

如果它拋出這個錯誤,那麼你可能還沒有找到一個依賴注入框架並正確配置它。您在MVC應用程序中使用哪種DI框架?你是如何配置它的?您需要在DI引導代碼中指定「IReservation」實例應該解析爲「Reservation」類。當然,根據DI框架,您選擇配置的方式會有所不同。你可以考慮閱讀你選擇的DI框架的文檔。 –

+0

我沒有做過這樣的事情。因爲它尚未在書中提及。我想我必須從外面學習它,或者繼續前進,直到我在某處詳細地討論這個話題。 :)。如果你分享一些重要的鏈接,這將是愚蠢的:) – Imad