非控制器类无法访问DbContext

时间:2019-08-22 11:22:26

标签: c# asp.net-mvc asp.net-core

我想在非控制器类中使用依赖注入来访问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;
    }

1 个答案:

答案 0 :(得分:4)

  

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

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

通常,您会

  • ShoppingCartController(网络api)
  • ShoppingCartService(业务逻辑)
  • ShoppingCart(普通的旧CLR对象,数据保存器,无逻辑)

控制器应注入服务。控制器不知道甚至存在“上下文”之类的东西。该服务获取上下文注入并执行所有业务逻辑。而购物车只是一个数据持有者。

请记住new is glue,如果您在代码中看到new并且它创建的内容不是普通的,愚蠢的数据持有人,则可能是错误的。


示例:

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