5

我试图理解依赖注入的概念。下面是我正在尝试调试的示例。在这里,我创建了 Customer 类,我在他的构造函数中注入了它的依赖项现在当我调用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();
    }
}
4

1 回答 1

2

您有CustomerController. 当它被调用时,您不会将任何内容分配给Iorder. 所以null在这种情况下。之后,在方法中,Index()您尝试GetOrderDetails()使用Iorder为空的方法执行方法。这失败了。当您创建内部方法的另一个实例时,您可以调用该实例。CustomerControllerIndex()GetOrderDetails()

一般来说,与依赖注入结合使用时,不建议使用多个构造函数。但是当有必要时,您应该将所有实例字段初始化为有效的东西。这称为本地默认值。一本关于依赖注入模式和反模式的优秀书籍是.NET 中的依赖注入。另请查看其作者的博客。

于 2013-09-24T10:16:24.113 回答