web-dev-qa-db-ja.com

ASP.NET COREの依存性注入でアクションフィルターを使用する方法

ASP.NET COREアプリケーションのすべての場所でコンストラクターベースの依存関係注入を使用し、アクションフィルターの依存関係も解決する必要があります。

public class MyAttribute : ActionFilterAttribute
{
    public int Limit { get; set; } // some custom parameters passed from Action
    private ICustomService CustomService { get; } // this must be resolved

    public MyAttribute()
    {
    }

    public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        // my code
        ...

        await next();
    }
}

次に、コントローラーで:

[MyAttribute(Limit = 10)]
public IActionResult()
{
    ...

ICustomServiceをコンストラクターに配置すると、プロジェクトをコンパイルできなくなります。それで、アクションフィルターでインターフェースインスタンスを取得するにはどうすればよいですか?

14
James Smith

Service Locatorパターンを回避する場合は、TypeFilterを使用したコンストラクター注入によってDIを使用できます。

コントローラーで使用

_[TypeFilter(typeof(MyActionFilterAttribute), Arguments = new object[] {10})]
public IActionResult() NiceAction
{
   ...
}
_

また、ActionFilterAttributeはサービスプロバイダーインスタンスにアクセスする必要がなくなりました。

_public class MyActionFilterAttribute : ActionFilterAttribute
{
    public int Limit { get; set; } // some custom parameters passed from Action
    private ICustomService CustomService { get; } // this must be resolved

    public MyActionFilterAttribute(ICustomService service, int limit)
    {
        CustomService = service;
        Limit = limit;
    }

    public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        await next();
    }
}
_

私にとっては、注釈[TypeFilter(typeof(MyActionFilterAttribute), Arguments = new object[] {10})]は厄介なようです。 [MyActionFilter(Limit = 10)]などの読みやすい注釈を取得するには、フィルターはTypeFilterAttributeから継承する必要があります。 asp.netのアクションフィルターにパラメーターを追加するにはどうすればよいですか に対する私の答えは、このアプローチの例を示しています。

16
Ralf Bönning

Service Locatorを使用できます:

public void OnActionExecuting(ActionExecutingContext actionContext)
{
     var service = actionContext.HttpContext.RequestServices.GetService<IService>();
}

汎用メソッドGetService<>は拡張メソッドであり、名前空間Microsoft.Extensions.DependencyInjectionに存在することに注意してください。

コンストラクター注入を使用する場合は、TypeFilterを使用します。 asp.netのアクションフィルターにパラメーターを追加する方法 を参照してください。

6
adem caglin

ServiceFiltersを使用して、コントローラーで必要なActionFilterをインスタンス化できます。

コントローラー内:

[ServiceFilter(typeof(TrackingAttribute), Order = 2)]

ServiceFilterが解決できるように、追跡コンテナーを依存関係コンテナーに登録する必要があります。

詳細については https://www.strathweb.com/2015/06/action-filters-service-filters-type-filters-asp-net-5-mvc-6/ をご覧ください。