2017-12-18 6 views
1

私のActionFilter属性内のデータベースコンテキストにアクセスする必要があります。どのように私はコンストラクタを介してコンテキストを渡さずにそれを行うことができますか?ASP.NETコアで "using"を使用してデータベース接続を開く方法は?

短い質問は、以前にASP.NETフレームワークで行ったように、データベースのコンテキストを1行で取得する方法です。

+0

DBコネクタを使用することはできますが、接続文字列を使用してインスタンス化しても問題ありません。 – Haytam

答えて

5

適切な方法は、依存関係注入を使用してフィルタを登録してから、ServiceFilterAttributeを使用してフィルタをパイプラインに配置することです。そうすることで、フィルタの型は依存関係注入を使って解決されるので、データベースのコンテキストを適切に注入し、通常どおりに使用することができます。

public class MyActionFilter : IActionFilter 
{ 
    private readonly MyDbContext _dbContext; 

    public MyActionFilter(MyDbContext dbContext) 
    { 
     _dbContext = dbContext; 
    } 

    public void OnActionExecuted(ActionExecutedContext context) 
    { 
     // use _dbContext here 
    } 

    public void OnActionExecuting(ActionExecutingContext context) 
    { } 
} 

Startup.ConfigureServicesタイプを登録します。その後、

services.AddTransient<MyActionFilter>(); 

そして、それをアクティブにするためにServiceFilterAttributeを使用しています。

[ServiceFilter(typeof(MyActionFilter))] 
public class MyController : Controller 
{ 
    // … 
} 

それともMvcOptionsを経由して、他のフィルタのようにグローバルに登録:コントローラやアクションの属性のいずれかとして

services.AddMvc(options => { 
    options.Filters.Add(new ServiceFilterAttribute(typeof(MyActionFilter))); 
}); 

その後、MyActionFilterが必要とする各リクエストに解決されますフィルタリングされ、データベースコンテキストは依存性注入コンテナから適切なライフタイムで注入されます。

データベース・コンテキストを(ユニット・テストの外で)インスタンス化することは、一般的に推奨されません。 ASP.NETコアには依存性注入コンテナがあるので、オブジェクトの存続期間や依存関係を自分で管理するのではなく、どこでも利用する必要があります。

関連する問題