Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 非控制器类无法访问DbContext_C#_Asp.net Mvc_Asp.net Core - Fatal编程技术网

C# 非控制器类无法访问DbContext

C# 非控制器类无法访问DbContext,c#,asp.net-mvc,asp.net-core,C#,Asp.net Mvc,Asp.net Core,我想在非控制器类中使用依赖项注入来访问DbContext对象 我有一个ShoppingCart控制器和一个购物车类,如下所示。在控制器类中,我成功地注入了DbContext,但在ShoppingCart类中没有。所以,我显式地从控制器传递_context对象 但是当我想直接使用ShoppingCart时,也就是说,没有控制器传递对象。我得到了ObjectDescoped异常 ShoppingCartController.cs: public class ShoppingCartControl

我想在非控制器类中使用依赖项注入来访问DbContext对象

我有一个ShoppingCart控制器和一个购物车类,如下所示。在控制器类中,我成功地注入了DbContext,但在ShoppingCart类中没有。所以,我显式地从控制器传递_context对象

但是当我想直接使用ShoppingCart时,也就是说,没有控制器传递对象。我得到了ObjectDescoped异常

ShoppingCartController.cs:

  public class ShoppingCartController : Controller
  {
    private readonly MrbFarmsDbContext _context;
    private ShoppingCart cart;

    public ShoppingCartController(MrbFarmsDbContext context)
    {
        _context = context;
        cart = new ShoppingCart(_context);
    }
   }
ShoppingCart.cs:

public class ShoppingCart
{
    private MrbFarmsDbContext _context;       
    public ShoppingCart(MrbFarmsDbContext context)//this constructer is called from Controller class.
    {            
        _context = context;
    }
    public ShoppingCart()
    {

    }
  }
方法:

    public static ShoppingCart GetCart(HttpContext context)
    {
        var cart = new ShoppingCart();

        cart.ShoppingCartId = cart.GetCartId(context);

        return cart;
    }
我想在非控制器类中使用依赖项注入来访问DbContext对象

然后将这些类注入控制器,不要让控制器创建它们

通常情况下,你会

  • ShoppingCartController(web api)
  • 购物车服务(业务逻辑)
  • ShoppingCart(普通的旧CLR对象,数据持有者,无逻辑)
控制器应该注入服务。控制器甚至不知道有“上下文”这样的东西。该服务注入上下文并执行所有业务逻辑。而购物车只是一个数据持有者

请记住,如果您在代码中看到一个
新的
,并且它创建的不是一个简单、愚蠢的数据持有者,那么它可能是错误的


例如:

public class ShoppingCartController : Controller
{
    private readonly IShoppingCartService shoppingCartService;

    public ShoppingCartController(IShoppingCartService shoppingCartService)
    {
        this.shoppingCartService = shoppingCartService;
    }
}

public class ShoppingCartService : IShoppingCartService 
{
    private readonly MrbFarmsDbContext context; 

    public ShoppingCartService(MrbFarmsDbContext context)
    {            
        this.context = context;
    }
}

您确定在启动时以正确的方式注入了类吗?
\u context
是一个私有变量。传递
context
对象,而不是相同的
\u context
。谢谢@nvoigt。这有帮助。但我做了一个改变——我完全删除了ShoppingCart类。我现在已经在服务类中编写了所有业务逻辑。