Sobes.tech
Middle+

Kā jūs izmantojat filtrus C# pipeline'os? Vai varat sniegt piemērus to izmantošanai?

sobes.tech AI

Atbilde no AI

C# konveijeru filtri tiek izmantoti, lai iejauktos un pārņemtu dažādos pieprasījuma apstrādes vai uzdevuma izpildes posmos. ASP.NET Core tīmekļa lietojumprogrammās tie ļauj pievienot loģiku pirms, pēc vai laikā, kad tiek izpildīti kontroliera darbības metodes, kā arī citos pieprasījuma apstrādes līmeņos.

ASP.NET Core filtru piemēri:

  1. Autentifikācija un autorizācija (Authentication/Authorization Filters): Nosaka, vai lietotājs ir tiesīgs veikt noteiktu darbību.

    // Autorize atribūta piemērs
    [Authorize]
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
    }
    
  2. Resursu filtri (Resource Filters): Pirmie tiek izpildīti pēc autorizācijas filtri. Tie var veikt kešatmiņas vai pārtraukt konveijeru.

    // Resursu filtra piemērs kešatmiņai
    public class CacheResourceFilter : IResourceFilter
    {
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            // Loģika pirms darbības izpildes
        }
    
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            // Loģika pēc darbības izpildes, bet pirms atbildes ierakstīšanas
        }
    }
    
  3. Darbību filtri (Action Filters): Tiek izpildīti pirms un pēc kontroliera darbības metodes izpildes. Tie ir piemēroti datu validācijai, žurnālu veidošanai vai rezultātu modifikācijai.

    // Darbības filtra piemērs žurnālam
    public class LogActionFilter : IActionFilter
    {
        public void OnActionExecuting(ActionExecutingContext context)
        {
            // Loģika pirms darbības
            Console.WriteLine($"Executing action: {context.ActionDescriptor.DisplayName}");
        }
    
        public void OnActionExecuted(ActionExecutedContext context)
        {
            // Loģika pēc darbības
            Console.WriteLine($"Executed action: {context.ActionDescriptor.DisplayName}");
        }
    }
    
    // Darbības filtra piemērošana kontroliera metodē
    [LogActionFilter]
    public IActionResult About()
    {
        return View();
    }
    
  4. Kļūdu filtri (Exception Filters): Apstrādā neapstrādātas kļūdas, kas rodas darbības metodes vai citu filtru laikā.

    // Kļūdu apstrādes filtra piemērs
    public class CustomExceptionFilter : IExceptionFilter
    {
        public void OnException(ExceptionContext context)
        {
            // Kļūdas apstrādes loģika
            context.Result = new ContentResult()
            {
                Content = "An error occurred.",
                StatusCode = 500
            };
            context.ExceptionHandled = true; // Norāda, ka kļūda ir apstrādāta
        }
    }
    
    // Kļūdu filtra piemērošana kontrolierim
    [CustomExceptionFilter]
    public class ErrorController : Controller
    {
        public IActionResult Index()
        {
            throw new Exception("Something went wrong!");
        }
    }
    
  5. Rezultātu filtri (Result Filters): Tiek izpildīti pirms un pēc darbības rezultāta metodes izpildes (piemēram, pirms vai pēc ViewResult, JsonResult utt.).

    // Rezultāta modifikācijas filtra piemērs
    public class CustomResultFilter : IResultFilter
    {
        public void OnResultExecuting(ResultExecutingContext context)
        {
            // Loģika pirms rezultāta metodes
            Console.WriteLine($"Executing result type: {context.Result.GetType().Name}");
        }
    
        public void OnResultExecuted(ResultExecutedContext context)
        {
            // Loģika pēc rezultāta metodes
            Console.WriteLine($"Executed result type: {context.Result.GetType().Name}");
        }
    }
    

Filtri var tikt piemēroti globāli (visām pieprasījumiem), kontroliera līmenī vai konkrētas darbības metodes līmenī. To izpildes secība ir atkarīga no to tipa.