gpt4 book ai didi

c# - 依赖注入(inject)和默认构造函数的使用

转载 作者:行者123 更新时间:2023-11-30 12:29:15 25 4
gpt4 key购买 nike

我想了解依赖注入(inject)的概念。下面是我正在尝试调试的示例。在这里我创建了 Customer 类,我在他的构造函数中注入(inject)了它的依赖项现在,当我在 Index 方法中调用 this.Iorder.GetOrderDetails(); 时,出现了 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() 方法中,您尝试使用 Iorder 执行方法 GetOrderDetails(),它为 null。这失败了。当您在方法 Index() 中创建 CustomerController另一个实例时,您可以对该实例调用 GetOrderDetails() .

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com