0

我有一个基于ASP.NET 2的MVC解决方案,带有一个通用控制器和一个自定义绑定器。ASP.NET Core - IModelBinder - 访问控制器DbContext

控制器代码如下:

public class GenericController<T> : Controller where T : BaseModel 
{ 
    public readonly AppContext Db = new AppContext(); 

    ... 

    public virtual ActionResult Edit([ModelBinder(typeof(MyCustomBinder))] T obj) 

所以,基本上,当我打电话编辑动作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

我会推荐,而不是手动新建DbContext,以从依赖注入中获取它的实例。

这样说,你可以很容易地通过构造函数注入获得DbContext

public class MyCustomBinder : IModelBinder 
{ 
    private readonly AppDbContext _dbContext; 

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

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