为了账号安全,请及时绑定邮箱和手机立即绑定

非控制器类无法访问 DbContext

非控制器类无法访问 DbContext

C#
LEATH 2023-09-16 15:16:43
我想在非控制器类中使用依赖项注入来访问我的 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);    }   }购物车.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 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

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

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

通常情况下,你会有

  • ShoppingCartController(网络 API),

  • ShoppingCartService(业务逻辑)

  • ShoppingCart(普通的旧 CLR 对象、数据持有者、无逻辑)

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

new记住,如果您new在代码中看到 a 并且它创建的东西不是普通的、愚蠢的数据持有者,那么它可能是错误的。


例子:

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;

    }

}


查看完整回答
反对 回复 2023-09-16
  • 1 回答
  • 0 关注
  • 72 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信