十大靠谱网赌平台-十大赌博平台排行榜

十大靠谱网赌平台-十大赌博平台排行榜

动作过滤器,以创建更干净的代码

表的内容

在十大赌博平台排行榜开发过程中,软件开发人员经常面临代码重复的问题. 有许多方法可以解决这个问题. 在这篇文章中,十大靠谱网赌平台将展示如何使用动作过滤器来清理代码.

过滤器在处理请求中的角色

动作过滤器允许在ASP中请求处理的各个阶段执行特定的动作.网络核心. 存在以下内置过滤器:

  • 授权的过滤器 首先执行,并确定是否允许用户完成当前请求.
  • 资源过滤器 在授权过滤器之后调用吗, 它们是必需的, 顾名思义, 处理资源. 特别是,这种类型的过滤器被用作缓存机制.
  • 行动过滤器 在处理请求的控制器方法执行之前和之后执行指定的动作.
  • 异常过滤器 用于捕获控制器创建过程中发生的未处理异常, 模型绑定, 以及执行控制器动作过滤器和方法.
  • 最后, 结果过滤器 如果控制器方法成功,是否调用. This type of filter is most commonly used to modify the final results; 例如, 开发人员可以创建自己的响应头, 他们添加了额外的信息.

下图显示了请求处理过程中过滤器被调用的顺序:

 调用过滤器的顺序

动作过滤器可以被认为是日常编程中最有用的. 在它们的帮助下,开发人员可以删除重复的代码片段,并将它们放在一个地方. 十大靠谱网赌平台将展示如何使用这些过滤器的示例, 但首先, 让十大靠谱网赌平台讨论一下过滤器本身.

动作过滤器在引擎盖下

ASP中的动作过滤器.净

要创建操作筛选器,开发人员需要实现 IActionFilter 接口. 该接口存在于ASP.的方法 OnActionExecuting,在控制器方法执行之前调用,并且 OnActionExecuted,这被称为立即之后. 下面是一个简单的动作过滤器实现的例子,它显示了控制器方法执行前后的调试信息:

公共 class CustomActionFilter:IActionFilter 
{ 
        公共 无效 OnActionExecuting(ActionExecutingContext filterContext) 
        { 
            调试.WriteLine (“之前行动执行”); 
        } 
        公共 无效 OnActionExecuted(ActionExecutedContext filterContext) 
        { 
            调试.WriteLine (“后行动执行”); 
        } 
}

要使用上面的过滤器,需要注册它. 为此,将以下行添加到 FilterConfig.cs 文件位于 App_Start 文件夹:

公共 静态 无效 RegisterGlobal过滤器(GlobalFilterCollection过滤器) 
{ 
        过滤器.Add ( H和leError属性 ()); 
        过滤器.Add ( CustomActionFilter ()); 
}

但是,使用过滤器作为属性要方便得多. 出于这些目的,有一个抽象类 ActionFilter属性 ,它从Filter属性类继承成员并实现 IActionFilterIResultFilter 接口. 因此,上面的类可以实现如下:

公共 class CustomActionFilter属性:ActionFilter属性 
{ 
        公共 覆盖 无效 OnActionExecuting(ActionExecutingContext filterContext) 
        { 
            调试.WriteLine (“之前行动执行”); 
        } 
        公共 覆盖 无效 OnActionExecuted(ActionExecutedContext filterContext) 
        { 
            调试.WriteLine (“后行动执行”); 
        } 
} 

现在,要应用这个过滤器,用这种方式将它添加到控制器方法中:

公共 class Home控制器 : 控制器 
{ 
        [CustomActionFilter] 
        公共 ActionResult 指数() 
        { 
            返回 视图(); 
        } 
}

这种方法还有一个小优势:开发人员可以将过滤器应用于特定的方法或整个控制器,而不需要在全局注册它们.

ASP中的动作过滤器.网络核心

随着ASP的引入,动作过滤器发生了很多变化.网络核心. 除了 IActionFilter 接口,现在有了 IAsyncActionFilter 与单个接口 OnActionExecutionAsync 方法. 类的实例 IAsyncActionFilter 接口:

公共 class AsyncCustomActionFilter属性:属性, IAsyncActionFilter 
{ 
        公共 异步 任务 OnActionExecutionAsync(ActionExecutingContext上下文, ActionExecutionDelegate) 
        { 
            调试.WriteLine (“之前行动执行”); 
            等待 next (); 
            调试.WriteLine (“后行动执行”); 
        } 
} 

ActionExecutionDelegate 委托作为第二个参数传递给方法. 在它的帮助下,要么调用下一个动作过滤器,要么调用控制器方法本身.

其用法与同步过滤器相同:

公共 class Home控制器 : 控制器 
{ 
        [CustomActionFilter] 
        公共 ActionResult 指数() 
        { 
            返回 视图(); 
        } 
}

抽象类 ActionFilter属性 也被改变了. 它是由 属性 类并实现动作过滤器的同步和异步接口(IActionFilterIAsyncActionFilter)及结果过滤器(IResultFilterIAsyncResultFilter),以及 IOrderedFilter 接口.

运行中的动作过滤器

现在,让十大靠谱网赌平台讨论一下使用动作过滤器更好的情况. 例如, 假设一个软件工程师创建了一个web应用程序,需要保存应用程序通过POST方法接收到的数据. 假设工程师保存了一个组织的雇员的信息. 要表示十大靠谱网赌平台器上的数据,可以使用以下类:

公共 class 员工 
{ 
        [要求(ErrorMessage = “必须要有名字”)] 
        公共 字符串 FirstName { 得到; ; } 
        [要求(ErrorMessage = “必须填写姓氏”)] 
        公共 字符串 LastName { 得到; ; } 
        [age = 18, ErrorMessage = “出生日期不正确”)] 
        公共 DateTime DateOfBirth { 得到; ; } 
        [StringLength(50, MinimumLength = 2)] 
        公共 字符串 位置{ 得到; ; } 
        [范围(45000、200000)] 
        公共 int 工资{ 得到; ; } 
} 

通过验证属性的帮助,开发人员可以控制输入数据的正确性. 应该注意的是,带有静态参数的属性并不总是验证数据的最佳方式. 例如,考虑上面示例中表示员工年龄和工资的字段. 如果开发人员创建一个专门的十大靠谱网赌平台来执行这些字段的验证,那就更好了, 但在本文的范围内, 让十大靠谱网赌平台只使用验证属性.

后实现了POST和PUT方法, 很明显,它们都包含重复的代码段:

[Http帖子] 
公共 IActionResult 帖子((FromBody)员工 价值) 
{ 
            if (价值 == ) 
            { 
                返回 Bad请求 ("员工值不能为空"); 
            } 
            if (!模型状态.是否是可用) 
            { 
                返回 Bad请求 (状态); 
            } 
            //执行保存操作 
            返回 Ok(); 
} 
[Http把] 
公共 IActionResult ((FromBody)员工 价值) 
{ 
            if (价值 == ) 
            { 
                返回 Bad请求 ("员工值不能为空"); 
            } 
            if (!模型状态.是否是可用) 
            { 
                返回 Bad请求 (状态); 
            } 
            //执行更新操作 
            返回 Ok(); 
} 

这就是动作过滤器的用武之地. 让十大靠谱网赌平台创建一个新的动作过滤器,并将重复的代码片段移动到它,如下所示:

公共 class 员工ValidationFilter属性 : ActionFilter属性 
{ 
        公共 覆盖 无效 OnActionExecuting(ActionExecutingContext上下文) 
        { 
            var employeeObject =上下文.ActionArguments.SingleOrDefault(p => p.价值 is 员工); 
            if (employeeObject.值= = ) 
            { 
                上下文.结果=  Bad请求ObjectResult ("员工值不能为空"); 
                返回; 
            } 
            if (!上下文.模型状态.是否是可用) 
            { 
                上下文.结果=  Bad请求ObjectResult (上下文.模型状态); 
            } 
        } 
} 

现在,多余的代码片段可以被删除:

公共 class 员工控制器 : 控制器Base 
{ 
        [员工ValidationFilter] 
        [Http帖子] 
        公共 IActionResult 帖子((FromBody)员工 价值) 
        { 
            //执行保存操作 
            返回 Ok(); 
        } 
        [员工ValidationFilter] 
        [Http把] 
        公共 IActionResult ((FromBody)员工 价值) 
        { 
            //执行更新操作 
            返回 Ok(); 
        } 
} 

作为一个结果, 代码看起来更紧凑、更漂亮, 但在目前的情况下, 它仍然可以简化. 控制器中只有两个方法, 两者都使用相同的过滤器, 所以属性可以直接应用到控制器上:

[员工ValidationFilter] 
公共 class 员工控制器 : 控制器Base 
{ 
            //执行更新操作 
} 

因此,在操作过滤器的帮助下,重复的代码片段被删除了. 这个过程看起来很简单, 但是用户应该做什么呢?他们需要将依赖传递给动作过滤器?

开发人员经常面临为各种方法添加日志记录的任务. 因此, 让十大靠谱网赌平台尝试在动作过滤器中添加一个日志工具,它将在控制器中执行POST或PUT方法之前和之后立即记录信息. 滤镜看起来像这样:

公共 class LoggingFilter: IActionFilter 
{ 
        私人 只读的 ILogger实例_logger; 
        公共 LoggingFilter(ILoggerFactory loggerFactory) 
        { 
            _logger = loggerFactory.CreateLogger(); 
        } 
        公共 无效 OnActionExecuted(ActionExecutedContext上下文) 
        { 
            _logger.LogInformation ($"{上下文.ActionDescriptor.DisplayName} 执行“); 
        } 
        公共 无效 OnActionExecuting(ActionExecutingContext上下文) 
        { 
            _logger.LogInformation ($"{上下文.ActionDescriptor.DisplayName} 是执行”); 
        } 
} 

现在,这个筛选器既可以全局应用,也可以应用于特定的部分. 让十大靠谱网赌平台先尝试全局注册. 为此,用户应该将以下语句添加到 启动.cs:

十大靠谱网赌平台.Add控制器s(选项 => 
{ 
                选项.过滤器.Add(); 
}); 

如果开发人员需要应用过滤器, 例如, 以一种特定的控制器方法, 那么滤清器应配合使用 ServiceFilter属性:

[Http帖子] 
[ServiceFilter (typeof (LoggingFilter))] 
公共 IActionResult 帖子((FromBody)员工 价值) 

ServiceFilter属性 是其他过滤器的工厂吗 IFilterFactory 界面和使用 IServiceProvider 获得适当的滤波器. 因此,应该将过滤器注册到 启动.cs 如下:

十大靠谱网赌平台.AddSingleton(); 

启动应用程序后, 十大靠谱网赌平台可以确保动作筛选器只应用于那些它被指定为属性的控制器和方法.

这种方法允许开发人员创建易于重用的实用工具属性. 下面是一个检查对象是否存在的筛选器示例. 过滤器使用对象的ID来搜索对象,如果对象存在,则返回该对象:

公共 class ProviderFilter : IActionFilter 
{ 
        私人 只读的 IDataProvider _dataProvider; 
        公共 ProviderFilter(IDataProvider dataProvider) 
        { 
            _dataProvider = dataProvider; 
        } 
        公共 无效 OnActionExecuted(ActionExecutedContext上下文) 
        { 
        } 
        公共 无效 OnActionExecuting(ActionExecutingContext上下文) 
        { 
            object id价值; 
            if (!上下文.ActionArguments.TryGet价值 ("id",  id价值)) 
            { 
                  ArgumentException ("id"); 
            } 
            var id = (int) id价值; 
            var 结果= _dataProvider.GetElement (id); 
            if (结果= = ) 
            { 
                上下文.结果=  NotFoundResult (); 
            } 
            其他的 
            { 
                上下文.HttpContext.项目.Add (“结果”,结果); 
            } 
        } 
} 

开发人员可以使用与前面示例中的筛选器相同的方式应用此筛选器 ServiceFilter属性.

操作过滤器通常用于基于User-Agent信息阻止特定浏览器的内容. 在web开发的早期, 许多网站都是专门为最流行的浏览器创建的, 而另一些则被认为是“禁止的”. 这种方法已经过时了, 现在建议创建大多数浏览器都能支持的HTML标记. 然而,在某些情况下,开发人员需要知道请求的来源. 下面是一个如何在动作过滤器中获取User-Agent信息的例子:

公共 class BrowserCheckFilter : IActionFilter 
{ 
        公共 无效 OnActionExecuting(ActionExecutingContext上下文) 
        { 
            var userAgent =上下文.HttpContext.请求.标题(HeaderNames.UserAgent].ToString ().低(); 
            //检测用户是否使用IE 
            if (userAgent.包含(“msie”) | | userAgent.包含(“三叉戟”)) 
            { 
                //做一些动作  
            } 
        } 
        公共 无效 OnActionExecuted(ActionExecutedContext上下文) 
        { 
        } 
} 

值得一提的是,上述方法还有另一个缺点. 许多浏览器都知道如何隐藏或伪造用户代理中指定的值, 因此,这个方法在确定用户浏览器的类型方面有些不可靠.

应用动作过滤器的另一个例子是本地化. 让十大靠谱网赌平台创建一个过滤器,根据指定的区域性显示日期. 下面是设置当前线程区域性的代码片段:

公共 class LocalizationActionFilter属性: ActionFilter属性 
{ 
        公共 覆盖 无效 OnActionExecuting(ActionExecutingContext filterContext) 
        { 
            var 语言= (字符串) filterContext.R出eData.值(“语言”] ?? "en"; 
            var 文化= (字符串) filterContext.R出eData.值(“文化”] ?? "GB"; 
            线程.Current线程.CurrentCulture = CultureInfo.GetCultureInfo ($"{语言}-{文化}"); 
            线程.Current线程.CurrentUICulture = CultureInfo.GetCultureInfo ($"{语言}-{文化}"); 
        } 
} 

下一步是添加将区域性数据URL重定向到控制器的路由:

                端点.Map控制器R出e(名称:“localizedR出e”, 
                    模式: ”{语言}-{文化}/{控制器}/{行动}/ {id}”, 
                    默认值:  
                    { 
                        语言= "en", 
                        文化= "GB", 
                        控制器= “日期”, 
                        action = “指数”, 
                        id = "", 
                    });

上面的代码片段创建了一个名为 localizedR出e,它在模板中有一个本地化参数. 该参数的默认值为“en-GB”。.

现在,让十大靠谱网赌平台创建一个名为 Date控制器 这将处理十大靠谱网赌平台的请求和一个显示本地化日期的视图. 控制器代码简单地将当前日期返回给视图:

[LocalizationActionFilter] 
公共 class Date控制器 : 控制器 
{ 
        公共 IActionResult 指数() 
        { 
            显示数据(“日期”] = DateTime.现在.ToShortDateString (); 
            返回 视图(); 
        } 
}  

当用户打开链接时 http://localhost:44338/Date,他们会在浏览器中看到以下内容:

本地化的日期

在上面的截图中, the current date is presented with the default localization; in our case, 这是扎. 现在, 如果用户打开了显式指示区域性的链接, 如en - us, 他们将看到以下内容:

本地化的日期

关闭

总之,十大靠谱网赌平台应该注意到过滤器只是ASP的许多机制之一.网提供. 因此, 这个问题很有可能在其他地方得到解决, 更熟悉的, 方法, 比如创建一个十大靠谱网赌平台,开发人员可以从中取出重复的代码. 正如你在上面看到的,过滤器的最大优点是它们易于实现和使用. 因此, 它们应该作为简单的方法被记住,可以在项目中实现,以保持代码整洁.

你可能也喜欢

博客文章 基于表达式树的业务规则编译器
2022年2月09年,
在这篇文章中, 我将告诉您十大靠谱网赌平台如何创建用户通知特性,以及十大靠谱网赌平台如何最终构建了一个基于表达式树的编译器,帮助十大靠谱网赌平台成功地完成了这项任务.
博客文章 例外中的例外 .净
2021年12月24日
c# /中的异常 .净可以有不同的行为. 并不是所有的,也不是所有的,都可以被处理和拦截. 本文描述了一组“击败”尝试-捕获-最终模式的异常.
博客文章 具有示例的可访问组件设计
2021年12月13日
关于ARIA属性、焦点顺序等的设计器指南. 如果您设计新的组件,这些信息将派上用场, 测试接口, 或者和前端工程师一起工作.