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をコンストラクターに配置すると、プロジェクトをコンパイルできなくなります。それで、アクションフィルターでインターフェースインスタンスを取得するにはどうすればよいですか?
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のアクションフィルターにパラメーターを追加するにはどうすればよいですか に対する私の答えは、このアプローチの例を示しています。
Service Locator
を使用できます:
public void OnActionExecuting(ActionExecutingContext actionContext)
{
var service = actionContext.HttpContext.RequestServices.GetService<IService>();
}
汎用メソッドGetService<>
は拡張メソッドであり、名前空間Microsoft.Extensions.DependencyInjection
に存在することに注意してください。
コンストラクター注入を使用する場合は、TypeFilter
を使用します。 asp.netのアクションフィルターにパラメーターを追加する方法 を参照してください。
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/ をご覧ください。