我试图理解依赖注入(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/