0

J'ai une solution MVC basée sur ASP.NET 2, avec un contrôleur générique et un classeur personnalisé.ASP.NET Core - IModelBinder - Contrôleur d'accès DbContext

Le code du contrôleur est le suivant:

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

    ... 

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

Donc, au fond, quand je l'appelle l'action Modifier la classe MyCustomBinder est appelée.

Le MyCustomBinderClass (qui hérite de DefaultModelBinder) doivent passer outre:

protected override PropertyDescriptorCollection GetModelProperties(ControllerContext controllerContext, ModelBindingContext bindingContext) 
protected override void BindProperty(ControllerContext controllerContext, ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor) 

et les deux méthodes ont une référence au "appelant" contrôleur.

Je suis en mesure d'accéder DbContext du contrôleur par:

dynamic controller = controllerContext.Controller; 
dynamic db = controller.Db; 

-

Maintenant, je passe à cœur ASP.NET. Afin de créer un liant personnalisé que je dois mettre en œuvre IModelBinder, donc je dois mettre en œuvre:

public Task BindModelAsync(ModelBindingContext bindingContext) 

La question est, comment puis-je accéder au DbContext du contrôleur d'appel?

J'ai besoin de cela pour effectuer des opérations sur les données db.

La première idée était d'avoir un seul contexte dans mon application, ce qui est évidemment faux (et conduit à des erreurs d'exécution).

Mais j'ai toujours besoin d'avoir le même contexte à la fois dans le contrôleur appelant et dans le classeur personnalisé; sinon cela conduit également à des erreurs dues au fait que les entités sont modifiées dans 2 contextes différents.

Une idée sur la façon de résoudre ce problème?

Merci!

Répondre

0

Je recommanderais, au lieu d'ajouter le DbContext manuellement, pour obtenir son instance de l'injection de dépendance. Cela dit, vous pouvez facilement obtenir le DbContext via l'injection du constructeur.

public class MyCustomBinder : IModelBinder 
{ 
    private readonly AppDbContext _dbContext; 

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

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