我想在非控制器类中使用依赖注入来访问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;
}
答案 0 :(得分:4)
我想在非控制器类中使用依赖注入来访问DbContext对象。
然后将这些类注入控制器,不要让控制器创建它们。
通常,您会
控制器应注入服务。控制器不知道甚至存在“上下文”之类的东西。该服务获取上下文注入并执行所有业务逻辑。而购物车只是一个数据持有者。
请记住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;
}
}