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

本文关键字:默认 构造函数 关系 注入 依赖 | 更新日期: 2023-09-27 18:32:29

我试图理解依赖注入的概念。下面是我尝试调试的示例。在这里,我创建了 Customer 类,我已将其依赖项注入到他的构造函数中现在,当我在 Index 方法中调用this.Iorder.GetOrderDetails();时,它给了我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();
    }
}

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

你有 CustomerController 的默认构造函数。调用它时,您无需为Iorder分配任何内容。所以在这种情况下null。之后,在方法 Index() 中,您尝试使用 Iorder 执行方法 GetOrderDetails(),这是空的。此操作失败。在方法 Index() 中创建另一个CustomerController实例时,可以在该实例上调用 GetOrderDetails()

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