0

我有一个基于 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?

我需要它才能对数据库数据执行操作。

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

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

关于如何解决这个问题的任何想法?

谢谢!

4

1 回答 1

0

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

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

public class MyCustomBinder : IModelBinder
{
    private readonly AppDbContext _dbContext;

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

    public Task BindModelAsync(ModelBindingContext bindingContext)
    {
        ...
    }
}
于 2017-10-11T00:06:03.637 回答