Bu makaleden önce ASP.NET Core filtre yapısına giriş makalesi olan ASP.NET Core MVC Filters (Filtreler) – 1 yazımı okumanızı öneririm.

Daha önceki makalede filtrelerin ne olduğu ile ilgili bilgi vermiştim. Bu yazımda ise nasıl uygulandığı ile ilgili bilgi paylaşmak istiyorum.

ASP.NET Core Filters (Filtrelerin) uygulanması

Filtrelerin senkron ve asenkron desteği vardır. Bunu farklı interface tanımlamaları sayesinde gerçekleştirebiliriz. Gerçekleştirilecek göreve göre senkron ya da asenkron olarak istediğiniz varyasyonu seçebilirsiniz.

Pipeline evresinden önce veya sonra kod çalıştırabilen senkron filtreler OnStageExecuting ve OnStageExecuted methodlarını tanımlar. Örneğin OnActionExecuting action metot çalışmadan önce çağrılır. OnActionExecuted ise action metot çalıştıktan sonra çağrılır.


using FiltersSample.Helper;
using Microsoft.AspNetCore.Mvc.Filters;

namespace FiltersSample.Filters
{
#region snippet_ActionFilter
public class SampleActionFilter : IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
// do something before the action executes
}

public void OnActionExecuted(ActionExecutedContext context)
{
// do something after the action executes
}
}
#endregion
}

Asenkron filtreler tek bir OnStageExecutionAsync metodu ile tanımlanır. Bu metot filtrenin pipeline evresini yürüten bir FilterTypeExecutionDelegate temsilcisi alır. Örneğin; ActionExecutionDelegate action metot çağırır ve siz kodunuz içerisinde dilediğiniz yerde kullanabilirsiniz. Aşağıdaki örnekte durum incelenmiştir.


using System.Threading.Tasks;

using Microsoft.AspNetCore.Mvc.Filters;

namespace FiltersSample.Filters

{

public class SampleAsyncActionFilter : IAsyncActionFilter

{

public async Task OnActionExecutionAsync(

ActionExecutingContext context,

ActionExecutionDelegate next)

{

// do something before the action executes

await next();

// do something after the action executes

}

}}

Dilerseniz tek bir class’ a  içerisinde bir çok filtre evresini ele almak için birden fazla interface uygulayabilirsiniz. Örneğin ActionFilterAttribute abstract sınıfı IActionFilter ve IResultFilter ı uygular. Asenkron biçimlerini de aynı şekilde ele alınabilir.

IFilterFactory Arayüzü

IFilterFactory interface i IFilter interface ini uygular. Böylece bir IFilterFactory örneği filter pipeline da herhangi bir yerde bir IFilter örneği gibi kullanılabilir. Framework filtreyi çağırmaya hazırlanırken onu bir IFilterFactory’ ye cast etmeye çalışır. Eğer cast başarılı ise CreateInstance metodu IFilter örneğini oluşturmak için tetiklenir. Bu yapı bize oldukça esnek bir yapı tasarım kazandırır. Çünkü artık uygulama başlarken filter pipeline nın hassasça ayarlanmasına gerek kalmamıştır.

IFilterFactory interface ini kendi Attribute uygulamalarınızda kullanarak filtre oluşturma işlemlerinde farklı bir yaklaşım olarak kullanabilirsiniz.


public class AddHeaderWithFactoryAttribute : Attribute, IFilterFactory

{

// Implement IFilterFactory

public IFilterMetadata CreateInstance(IServiceProvider serviceProvider)

{

return new InternalAddHeaderFilter();

}

private class InternalAddHeaderFilter : IResultFilter

{

public void OnResultExecuting(ResultExecutingContext context)

{

context.HttpContext.Response.Headers.Add(

"Internal", new string[] { "Header Added" });

}

public void OnResultExecuted(ResultExecutedContext context)

{

}

}

public bool IsReusable

{

get

{

return false;

}

}

}