依赖注入和使用默认构造函数

时间:2013-09-24 10:05:47

标签: c# dependency-injection code-injection

我试图了解依赖注入概念。 下面是我尝试调试的示例。 在这里,我创建了Customer类,其依赖项在我的构造函数中有Injected 现在,当我在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 :(得分:2)

您有CustomerController的默认构造函数。调用它时,不会为Iorder指定任何内容。所以在这种情况下null。在方法Index()之后,您尝试使用GetOrderDetails()执行方法Iorder,该方法为null。这失败了。当您在方法CustomerController中创建另一个 Index()实例时,您可以在该实例上调用GetOrderDetails()

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