我有一个基于ASP.NET 2的MVC解决方案,带有通用控制器和自定义绑定器。
控制器代码如下:
public class GenericController<T> : Controller where T : BaseModel
{
public readonly AppContext Db = new AppContext();
...
public virtual ActionResult Edit([ModelBinder(typeof(MyCustomBinder))] T obj)
所以,基本上,当我调用Edit动作时,会调用MyCustomBinder类。
MyCustomBinderClass(继承自 DefaultModelBinder )需要覆盖:
protected override PropertyDescriptorCollection GetModelProperties(ControllerContext controllerContext, ModelBindingContext bindingContext)
protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor)
并且两种方法都引用了“调用”控制器。
所以我可以通过以下方式访问控制器的DbContext:
dynamic controller = controllerContext.Controller;
dynamic db = controller.Db;
-
现在,我正在转向ASP.NET核心。为了创建自定义绑定器,我需要实现 IModelBinder ,所以我需要实现:
public Task BindModelAsync(ModelBindingContext bindingContext)
问题是,如何访问调用控制器的DbContext?
我需要这样才能对db数据执行操作。
第一个想法是在我的应用程序中只有一个上下文,这显然是错误的(并导致运行时错误)。
但是我仍然需要在调用控制器和自定义绑定器中具有相同的上下文;否则,由于实体在两个不同的上下文中被修改,这也会导致错误。
如何解决这个问题?
谢谢!
答案 0 :(得分:0)
我建议不要手动修改DbContext
,而是从依赖注入中获取它的实例。
话虽如此,您可以通过构造函数注入轻松获得DbContext
。
public class MyCustomBinder : IModelBinder
{
private readonly AppDbContext _dbContext;
public MyCustomBinder(AppDbContext dbContext)
{
_dbContext = dbContext;
}
public Task BindModelAsync(ModelBindingContext bindingContext)
{
...
}
}