2013-09-24 91 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。另外看看它的作者的博客。

相关问题