2013-09-24 88 views
4

我想了解依賴注入概念。 下面是我正在嘗試調試的示例。 在這裏,我創建了客戶類的依賴關係,我的注入他的構造函數 現在當我調用this.Iorder.GetOrderDetails();Index方法它給我錯誤NullReferenceException並要求使用new關鍵字來創建一個對象來調用該方法。 當我將此調用this.Iorder.GetOrderDetails();移動到另一個方法GetCutomerDetails()並在索引方法中調用該方法時,該方法起作用。依賴注入和使用默認構造函數

問題:我無法理解爲什麼this.Iorder.GetOrderDetails()方法調用不Index方法工作,爲什麼它工作在GetCutomerDetails()

public interface IorderDetails 
{ 
    void GetOrderDetails(); 
} 

public class CustomerModel : IorderDetails 
{ 
    public void GetOrderDetails() {} 
} 

控制器:

public class CustomerController: Controller 
{ 
    private IorderDetails Iorder; 

    //DI constructor Injecting OrderDetails object 
    CustomerController(IorderDetails iorderObj) 
    { 
     if (iorderObj == null) 
      throw new ArgumentNullException("orderObj should not be null"); 

     this.Iorder = iorderObj; 
    } 
    //Default constructor 
    public CustomerController() { } 

    public ActionResult Index() 
    {    
     CustomerController objCustomer = new CustomerController(new CustomerModel()); 
     objCustomer.GetCutomerDetails(); 

     //Commented GetOrderDetails() method 
     //this.Iorder.GetOrderDetails();    
     return View(); 
    } 

    public ActionResult GetCutomerDetails() 
    { 
     this.Iorder.GetOrderDetails(); 
     return View(); 
    } 
} 
+1

你的意思是依賴注射? –

+0

你在使用什麼來將IOrderDetails注入到CustomerController類中? – stuartmclark

+0

刪除默認的構造函數,你將會看到爲什麼你的代碼不能在Index方法中工作 –

回答

2

您有默認構造函數爲CustomerController。當它被調用時,你不會分配任何東西給Iorder。所以在這種情況下是null。之後,在方法Index()中,嘗試使用Iorder執行方法GetOrderDetails(),該方法爲null。這失敗了。當您在方法Index()內創建另一個CustomerController的實例時,可以在該實例上調用GetOrderDetails()

通常,與依賴注入結合使用時,不建議使用多個構造函數。但是當有必要的時候,你應該初始化所有的實例字段到一些有用的東西。這被稱爲本地默認值。關於依賴注入模式和反模式的優秀書籍是Dependency Injection in .NET。另外看看它的作者的博客。

相關問題