ASP.NET Core - IModelBinder - 访问控制器DbContext

时间:2017-10-10 12:40:17

标签: asp.net asp.net-core asp.net-core-mvc dbcontext imodelbinder

我有一个基于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数据执行操作。

第一个想法是在我的应用程序中只有一个上下文,这显然是错误的(并导致运行时错误)。

但是我仍然需要在调用控制器和自定义绑定器中具有相同的上下文;否则,由于实体在两个不同的上下文中被修改,这也会导致错误。

如何解决这个问题?

谢谢!

1 个答案:

答案 0 :(得分:0)

我建议不要手动修改DbContext,而是从依赖注入中获取它的实例。

话虽如此,您可以通过构造函数注入轻松获得DbContext

public class MyCustomBinder : IModelBinder
{
    private readonly AppDbContext _dbContext;

    public MyCustomBinder(AppDbContext dbContext)
    {
        _dbContext = dbContext;
    }

    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        ...
    }
}