如何实现数据库上下文的依赖注入

时间:2019-02-17 19:40:10

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

我正在尝试使此tutorial适应如何在asp.net核心mvc中制作购物车,但是我在db上下文方面遇到了麻烦。我收到以下错误:

错误CS7036没有给出与“ StoreContext.StoreContext(DbContextOptions)”的所需形式参数“ options”相对应的参数

我已经看过这个question并实现了解决方案,但仍然不能解决我的问题。

这是我的代码:

    public class ShoppingCart
    {
        private readonly StoreContext db;

        public ShoppingCart(StoreContext context)
        {
            db = context;
        }

        string ShoppingCartId { get; set; }

        public const string CartessionKey = "CartId";

        public static ShoppingCart GetCart(HttpContext context)
        {
            var cart = new ShoppingCart();
            cart.ShoppingCartId = cart.GetCartId(context);
            return cart;
        }
}

如果我按照建议将代码更改为以下内容:

    public static ShoppingCart GetCart(HttpContext context)
    {
        **var cart = new ShoppingCart(db);**
        cart.ShoppingCartId = cart.GetCartId(context);
        return cart;
    }

然后我收到一个新错误:

System.NullReferenceException:对象引用未设置为对象的实例。

因此,尽管进行了更正,但似乎仍无法正确注入数据库。有指导吗?

这里是存储上下文:

    public StoreContext(DbContextOptions<StoreContext> options)
        : base(options)
    {
    }

    public DbSet<Product> Product { get; set; }
    public DbSet<Supplier> Supplier { get; set; }
    public DbSet<Cart> Cart { get; set; }
    public DbSet<Order> Order { get; set; }
    public DbSet<OrderDetail> OrderDetail { get; set; }
}

这是我启动时的连接字符串:

    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

        services.AddDbContext<StoreContext>(options =>
                options.UseSqlServer(Configuration.GetConnectionString("StoreContext")));
    }

1 个答案:

答案 0 :(得分:0)

嘿,您能告诉我们您的startup.cs文件吗?我认为这与它有关

好吧,我完全错过了这个问题,很糟糕,显然您是在创建购物车新类而没有传递注入顶部的上下文,

尝试将行更改为

var cart = new ShoppingCart(db);