为什么依赖注入在 ASP.net Core 后不起作用?

use*_*456 1 c# dependency-injection asp.net-core

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

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

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

这是我的控制器类;

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();
        }


    }
}
Run Code Online (Sandbox Code Playgroud)

我在主类中注册了服务:

builder.Services.AddScoped<IOrderRepository, OrderRepository>();
builder.Services.AddScoped<ShoppingCart>();
Run Code Online (Sandbox Code Playgroud)

小智 5

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

public OrderController(IOrderRepository _orderRepository, ShoppingCart _shoppingCart)
{
    _orderRepository = _orderRepository;
    _shoppingCart = _shoppingCart;
}
Run Code Online (Sandbox Code Playgroud)

public OrderController(IOrderRepository orderRepository, ShoppingCart shoppingCart)
    {
        _orderRepository = orderRepository;
        _shoppingCart = shoppingCart;
    }
Run Code Online (Sandbox Code Playgroud)

  • 值得解释一下为什么问题首先发生——参数是在构造函数的作用域中定义的,因此它们隐藏了在外部作用域中定义的同名字段。我认为编译器已经为此生成了警告。雷夏珀当然可以 (2认同)