【问题标题】:Why dependency injection is not working in post ASP.net core?为什么依赖注入在 ASP.net 核心后不起作用?
【发布时间】:2022-02-23 21:52:44
【问题描述】:

我在我的控制器中注入了两个类。

在get请求中,当我放一个断点时,我可以看到构造函数中正在检索一个实例。

但是在 post 操作中,实例为空?

这是我的控制器类;

using BethanyPieShop.Models;
using Microsoft.AspNetCore.Mvc;

namespace BethanyPieShop.Controllers
{
    public class OrderController : Controller
    {
        public IOrderRepository _orderRepository { get; set; }
        public ShoppingCart _shoppingCart { get; set; }

        public OrderController(IOrderRepository _orderRepository, ShoppingCart _shoppingCart)
        {
            _orderRepository = _orderRepository;
            _shoppingCart = _shoppingCart;
        }
        public IActionResult Checkout()
        {

            return View();
        }

        [HttpPost]
        public IActionResult Checkout(Order order)
        {
            // Null here _shoppingCart
            var items = _shoppingCart.GetShoppingCartItems();
            _shoppingCart.ShoppingCartItems = items;

            if (_shoppingCart.ShoppingCartItems.Count == 0)
            {
                ModelState.AddModelError("", "Your cart is empty, add some pies first");
            }

            if (ModelState.IsValid)
            {
                _orderRepository.CreateOrder(order);
                _shoppingCart.ClearCart();
                return RedirectToAction("CheckoutComplete");
            }
            return View(order);
        }


        public IActionResult CheckoutComplete()
        {
            ViewBag.CheckoutCompleteMessage = ", thanks for your order. You'll soon enjoy our delicious pies!";
            return View();
        }


    }
}

我在主类中注册了服务:

builder.Services.AddScoped<IOrderRepository, OrderRepository>();
builder.Services.AddScoped<ShoppingCart>();

【问题讨论】:

  • 您的参数与字段同名,因此请隐藏它们。我怀疑您已经收到有关此的编译器警告。您的代码正在将参数值分配给参数本身
  • 不要在参数名称中使用前导下划线。按照惯例,前导下划线仅用于私有字段。

标签: c# asp.net-core dependency-injection


【解决方案1】:

您正在设置一个具有相同名称的变量。不使用“这个”。陈述。尝试更改以下内容

public OrderController(IOrderRepository _orderRepository, ShoppingCart _shoppingCart)
{
    _orderRepository = _orderRepository;
    _shoppingCart = _shoppingCart;
}

public OrderController(IOrderRepository orderRepository, ShoppingCart shoppingCart)
    {
        _orderRepository = orderRepository;
        _shoppingCart = shoppingCart;
    }

【讨论】:

  • 首先解释一下为什么会出现问题是值得的——参数是在构造函数的作用域中定义的,因此它们隐藏了在外部作用域中定义的同名字段。我认为编译器已经为此生成了警告。 Resharper 当然可以
【解决方案2】:

所以我认为你应该使用它。像这样:

public OrderController(IOrderRepository _orderRepository, ShoppingCart _shoppingCart)
    {
        this._orderRepository = _orderRepository;
        this._shoppingCart = _shoppingCart;
    }

【讨论】:

  • 真正的解决方案是在公共成员参数中使用下划线
  • 没错,我个人会将这些变量设为私有只读。
  • @PanagiotisKanavos 谢谢我会改变它
  • @JorneSchuurmans 谢谢我会改的
猜你喜欢
  • 2020-04-13
  • 2018-01-03
  • 2011-08-07
  • 2019-06-07
  • 2019-11-18
  • 1970-01-01
  • 1970-01-01
  • 2018-12-14
  • 2020-04-04
相关资源
最近更新 更多