0

ASP.NET 2をベースにした汎用コントローラーとカスタムバインダーを使用したMVCソリューションがあります。私は編集アクションを呼び出すときASP.NETコア - 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クラスが呼び出されます。

コントローラのコードは次のようです。

(DefaultModelBinderから継承)MyCustomBinderClassをオーバーライドする必要があります

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つのコンテキストしか持たないことでしたが、明らかに間違っていて(実行時エラーにつながります)。

しかし、私は呼び出し側のコントローラとカスタムバインダの両方で同じコンテキストを持つ必要があります。さもなければ、これはエンティティが2つの異なった文脈で修正されるという事実に起因するエラーにつながる。

これを解決する方法はありますか?

ありがとうございます!

答えて

0

DbContextを手動で新しくする代わりに、そのインスタンスを依存関係注入から取得することをお勧めします。

これで、コンストラクタインジェクションによって簡単にDbContextを取得できます。

public class MyCustomBinder : IModelBinder 
{ 
    private readonly AppDbContext _dbContext; 

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

    public Task BindModelAsync(ModelBindingContext bindingContext) 
    { 
     ... 
    } 
} 
関連する問題