我试图理解依赖注入(inject)的概念。
下面是我正在尝试调试的示例。
在这里,我创建了 Customer 类,我在他的构造函数中注入(inject)了其依赖项
现在,当我在 this.Iorder.GetOrderDetails(); 方法中调用 Index 时,它​​给了我 NullReferenceException 错误并要求使用 new 关键字创建一个对象来调用该方法。
当我将此调用 this.Iorder.GetOrderDetails(); 移动到另一个方法 GetCutomerDetails() 并在 Index Method 中调用该方法时,它可以工作。

问题 :我无法理解为什么 this.Iorder.GetOrderDetails() 方法调用在 Index 方法中不起作用以及为什么它在 GetCutomerDetails() 中起作用

public  interface IorderDetails
{
    void GetOrderDetails();
}

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

Controller :
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() 中,您尝试使用 GetOrderDetails() 执行方法 Iorder ,该代码为空。这失败了。当您在方法 CustomerController 内创建 Index() 的另一个 实例时,您可以在该实例上调用 GetOrderDetails()

一般来说,与依赖注入(inject)结合使用时,不建议使用多个构造函数。但是在必要时,您应该将所有实例字段初始化为有效的内容。这称为本地默认值。 Dependency Injection in .NET 是一本关于依赖注入(inject)模式和反模式的优秀书籍。还可以查看其作者的博客。

关于c# - 依赖注入(inject)和默认构造函数的使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18978585/

10-09 06:59
查看更多