我试图了解依赖注入概念。
下面是我尝试调试的示例。
在这里,我创建了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();
}
}
答案 0 :(得分:2)
您有CustomerController
的默认构造函数。调用它时,不会为Iorder
指定任何内容。所以在这种情况下null
。在方法Index()
之后,您尝试使用GetOrderDetails()
执行方法Iorder
,该方法为null。这失败了。当您在方法CustomerController
中创建另一个 Index()
实例时,您可以在该实例上调用GetOrderDetails()
。
通常,在与依赖注入结合使用时,不建议使用多个构造函数。但是在必要时,您应该将所有实例字段初始化为有效的东西。这称为本地默认值。关于依赖注入模式和反模式的优秀书籍是Dependency Injection in .NET。另请查看其作者的博客。