ASP.NET Core - IModelBinder - 访问控制器DbContext
问题描述:
我有一个基于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数据执行操作。
第一个想法是在我的应用程序中只有一个上下文,这显然是错误的(并导致运行时错误)。
但我仍然需要在调用控制器和自定义联编程序中都有相同的上下文;否则这也会导致错误,因为实体在两种不同的上下文中被修改。
关于如何解决这个问题的任何想法?
谢谢!
答
我会推荐,而不是手动新建DbContext
,以从依赖注入中获取它的实例。
这样说,你可以很容易地通过构造函数注入获得DbContext
。
public class MyCustomBinder : IModelBinder
{
private readonly AppDbContext _dbContext;
public MyCustomBinder(AppDbContext dbContext)
{
_dbContext = dbContext;
}
public Task BindModelAsync(ModelBindingContext bindingContext)
{
...
}
}