.NET 6开发TodoList应用之实现ActionFilter

yizhihongxing

下面是“.NET 6开发TodoList应用之实现ActionFilter”的完整攻略。

前言

在Web应用的开发中,ActionFilter 可以帮助我们在请求流程中执行一些共享的逻辑,例如,身份验证、日志记录、全局异常处理等等。使用ActionFilter 可以将这些逻辑隔离到一个独立的类中,使得各个控制器方法之间耦合度更低,代码复用更高效。

在后续的示例中,我们将演示如何通过实现一个ActionFilter来给TodoList增加一个“TRACE”功能。

实现步骤

创建ActionFilter类

在项目中创建一个新的类文件,例如,我们可以创建一个名为TraceActionFilter.cs的类,这个类继承自IActionFilter。下面是示例代码:

using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Logging;
using System.Diagnostics;

namespace TodoListWebApp.ActionFilters
{
    public class TraceActionFilter : IActionFilter
    {
        private readonly ILogger<TraceActionFilter> logger;

        public TraceActionFilter(ILogger<TraceActionFilter> logger)
        {
            this.logger = logger;
        }

        public void OnActionExecuting(ActionExecutingContext context)
        {
            logger.LogInformation($"Action {context.ActionDescriptor.DisplayName} start executing");
            context.HttpContext.Items.Add("Stopwatch", Stopwatch.StartNew());
        }

        public void OnActionExecuted(ActionExecutedContext context)
        {
            var stopwatch = (Stopwatch)context.HttpContext.Items["Stopwatch"];
            stopwatch.Stop();
            logger.LogInformation($"Action {context.ActionDescriptor.DisplayName} finished executing in {stopwatch.ElapsedMilliseconds}ms");
        }
    }
}

代码解释:

  • 首先,我们在构造函数中注入了一个ILogger实例,用于日志的记录;
  • 在OnActionExecuting方法中,我们使用ILogger记录Action方法开始执行;
  • 我们使用HttpContext.Items字典存储一个StopWatch,
  • 然后在OnActionExecuted方法中,我们获取StopWatch并停止计时,
  • 然后记录Action方法执行的时间。

注册ActionFilter

我们需要将此ActionFilter注册到Startup.cs中。其中使用services.AddScoped<>()方法,将其添加到DI容器中:

services.AddScoped<TraceActionFilter>(); 

然后我们在Configure方法中,使用MapControllerRoute方法让全局应用该ActionFilter:

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller}/{action}/{id?}",
        defaults: new { controller = "Home", action = "Index" })
        .RequireAuthorization()
        .WithMetadata(new TraceActionFilter());
});

在示例中,我们需要全局对TodoList应用启用ActionFilter,因此我们给MapControllerRoute方法添加了WithMetadata方法,该方法会应用指定的ActionFilter。

应用ActionFilter

在需要应用ActionFilter的Controller或method上增加特性,例如在TodoListsController的GetAll方法上应用我们实现的TraceActionFilter就可以了:

[HttpGet]
[TraceActionFilter]
public async Task<ActionResult<IEnumerable<TodoItem>>> GetAll()
{
    var todoItems = await todoItemService.GetTodoItemsAsync();
    return Ok(todoItems);
}

运行应用

现在我们可以使用Postman或Fiddler等工具来模拟HTTP请求访问我们的TodoList应用。当我们访问GetAll方法时,我们就可以在应用的日志中看到类似以下的输出:

info: TodoListWebApp.ActionFilters.TraceActionFilter[0]
      Action TodoListsController.GetAll start executing
info: TodoListWebApp.ActionFilters.TraceActionFilter[0]
      Action TodoListsController.GetAll finished executing in 60ms

在以上输出中,我们可以看到我们的TraceActionFilter输出了Action方法开始执行和完成执行的日志,并且在完成执行时,输出了Action执行的时间。

示例说明

在实现ActionFilter意味着我们可以很方便地执行各种共享的逻辑。例如,我们在上述示例中实现的TraceActionFilter可以方便地增加跟踪Action执行时间的功能;我们也可以实现身份验证逻辑,添加数据缓存,全局异常处理等等。ActionFilter可以帮助我们使控制器代码保持最佳实践,同时也方便了代码复用和维护。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:.NET 6开发TodoList应用之实现ActionFilter - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • 云计算第二阶段shell脚本

    pstree                         #查看进程树 cat /etc/shells                #查看系统安装的所有shell解释器 yum -y install ksh                      #安装新的解释器   1、声明解释器                 #!/bin/bash 2、注释脚…

    云计算 2023年4月10日
    00
  • 外媒:云计算之后,物联网正催化雾计算和边缘计算吗

    我们已经超越云计算了吗?物联网(IoT)正在催生新的方法。 美国2017年智能手机用户预计将达到2.29亿,全世界呢?接近20亿!对这些数字感到惊讶?看一下这些数字背后的原因,才叫人惊讶。 我的一位老熟人是资深的电脑销售人员,总是说:“我刚入行的时候,电脑还是大型机——现在我的口袋里就能装下。”这些迷你的设备拥有强大的计算能力,比最近的超级计算机还要强大。 …

    云计算 2023年4月12日
    00
  • 基于ABP框架实现RBAC(角色访问控制)

    下面是关于“基于ABP框架实现RBAC(角色访问控制)”的完整攻略,包含两个示例说明。 简介 ABP框架是一个开源的ASP.NET Core应用程序框架,它提供了一系列的基础设施和最佳实践,可以帮助开发人员快速构建高质量的企业级应用程序。本文将详细讲解如何使用ABP框架实现RBAC(角色访问控制)。 RBAC的概念 RBAC(Role-Based Acces…

    云计算 2023年5月16日
    00
  • 03云计算架构

    云计算的本质 云计算的本质是一切IT即服务 云计算为大数据提供计算平台 虚拟化是云计算的基石 云数据中心 构造主要有两种模式 传统模式 数据中心基于集装箱的数据中心,由Google首创 云工作负载模式 时开时停模式 用户迅速增长模式 瞬时暴涨模式 周期性增减模式 云计算架构 中央集权架构 客户机/服务器(C/S)架构 中间层架构 浏览器/服务器(B/S)架构…

    云计算 2023年4月11日
    00
  • 云计算概念

    云计算概念 云计算是一种模式,可以通过网络获取资源;优势:通过弹性计算,按使用需求付费 云主机:支持后续增加CPU或内存VPS:不支持以上云主机特点 分类:公有云、私有云、混合云 虚拟化技术:一般理解上,是在一个操作系统之上,模拟另一个操作系统的执行环境。 云计算使用了虚拟化技术   KVM 定义:基于内核的虚拟机 kvm虚拟化特性: 1. 嵌入到Linux…

    云计算 2023年4月10日
    00
  • 腾讯的云计算平台构建工具 开源

    Blade 是一个现代构建系统,期望的目标是强大而好用,把程序员从构建的繁琐中解放出来。 Blade主要定位于linux下的大型C++项目,密切配合研发流程,比如单元测试,持续集成,覆盖率统计等。但像unix下的文本过滤程序一样,保持相对的独立性,可以单独运行。目前重点支持i386/x86_64 Linux,未来可以考虑支持其他的类unix系统。 在腾讯公司…

    云计算 2023年4月10日
    00
  • Python可以从事的工作/就业岗位总结

    Python是一门广泛应用于数据科学、机器学习、Web开发等领域的高级编程语言。因其简洁易懂、跨平台易用等优点,近年来越来越受到企业和公司的青睐。下面详细讲解Python可以从事的工作和就业岗位总结,以及如何进军这些领域。 Python相关的就业岗位 数据科学家 Python作为数据分析和数据科学的工具之一,让人们从各种数据中发现可以利用、且与业务相关的知识…

    云计算 2023年5月18日
    00
  • Python面向对象class类属性及子类用法分析

    Python面向对象class类属性及子类用法分析 在Python中,面向对象编程是一种强大的编程方法,其中class类是面向对象编程的基本单位。 本文将讲解Python中的class类属性及其子类用法,以及提供两个示例说明。 Class类属性 class类能够定义变量,也就是属性。这些属性通常是定义在class的方法之外的,因此是公用的,即被所有的实例对象…

    云计算 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部