Sobes.tech
Middle+

Kuidas te kasutate filtreid C#-s pipeline'ides? Kas saate anda nende kasutamise näiteid?

sobes.tech AI

Vastus AI-lt

Filtre v C# konveijeros tiek izmantoti, lai iejauktos ir iejauktos 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): Vykdomi pirmie pēc autorizācijas filtra. 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
        }
    
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            // Loģika pēc darbības, bet pirms atbildes ierakstīšanas
        }
    }
    
  3. Darbību filtri (Action Filters): Vykdomi pirms un pēc kontroliera darbības metodes izpildes. Tie ir piemēroti datu validācijai, žurnālam 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 kontrolera 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): Vykdomi pirms un pēc darbības rezultāta metodes izpildes (piem., 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
            Console.WriteLine($"Executing result type: {context.Result.GetType().Name}");
        }
    
        public void OnResultExecuted(ResultExecutedContext context)
        {
            // Loģika pēc rezultāta
            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.