仿 MVC 三大特性
1.先做个小例子
特性,只能通过反射实现
我们自定义一个特性
public class CustomAttribute : Attribute
{
public int Id;
public string Name;
public string Reamrk;
public string Desc;
public CustomAttribute() : this(0, "") { }//如果没传参,使用this给默认值
public CustomAttribute(int _id, string _name)
{
this.Id = _id;
this.Name = _name;
}
public void Show()
{
Console.WriteLine($"{Id}_{Name}_{Reamrk}_{Desc}");
}
}
写一个类并注册特性
[Custom(123,"kxy",Desc ="是个帅哥",Reamrk ="学员")]
public class Student
{
[Custom(124, "wzz", Desc = "是个丑逼", Reamrk = "学员")]
public void Study()
{
Console.WriteLine($"正在学习");
}
}
实现特性调用,只能通过反射,没办法和MVC那样直接调用接口特性就会执行(因为MVC已经封装好了调用的反射机制)
class Program
{
static void Main(string[] args)
{
Student student = new Student();
Type type = student.GetType();
// 判断该类是否注册了CustomAttribute
if (type.IsDefined(typeof(CustomAttribute), true))
{
var attribute = type.GetCustomAttribute<CustomAttribute>();
attribute.Show();
} MethodInfo method = type.GetMethod("Study");
// 判断该方法是否注册了CustomAttribute
if (method.IsDefined(typeof(CustomAttribute), true))
{
var attribute = method.GetCustomAttribute<CustomAttribute>();
attribute.Show();
} // 执行了特性之后执行方法
student.Study();
Console.ReadLine();
}
}
结果:
由上可知,执行步骤先是执行类注册、在是方法注册的特性,然后再是执行我们需要的方法
这个思路和MVC 提供的特性是一致的
2.MVC特性思路
先定义三大特性
namespace Study.CustomMVCAttribute.CustomMVCAttribute
{
/// <summary>
/// 基类不做操作
/// 所有Filter只打印,不实现功能
/// </summary>
public class FilterAttribute : Attribute { }
/// <summary>
/// 权限Filter
/// </summary>
public class AuthorizeAttribute : FilterAttribute
{
public void OnAuthorization()
{
Console.WriteLine("OnAuthorization");
}
}
/// <summary>
/// 动作Filter
/// </summary>
public class ActionFilterAttribute : FilterAttribute
{
public void OnActionExecuting()
{
Console.WriteLine("OnActionExecuting");
}
public void OnActionExecuted()
{
Console.WriteLine("OnActionExecuted");
}
// OnResultExecuting 和 OnResultExecuted 先不管
}
/// <summary>
/// 捕捉异常Filter
/// </summary>
public class HandleErrorAttribute : FilterAttribute
{
public void OnException()
{
Console.WriteLine("OnException");
}
}
}
定义 ControllerActionInvoker
using System;
using System.Linq;
using System.Reflection; namespace Study.CustomMVCAttribute.CustomMVCAttribute
{
public class ControllerActionInvoker
{
/// <summary>
/// 实例化
/// </summary>
/// <param name="instance">调用的实例</param>
/// <param name="action">方法名</param>
/// <param name="parameters">参数</param>
public static void InvokeAction(object instance, string action, object[] parameters = null)
{
Type type = instance.GetType();
MethodInfo method = type.GetMethod(action);
if (method.IsDefined(typeof(FilterAttribute), true))
{
var filterList = method.GetCustomAttributes<FilterAttribute>();
try
{
// 授权
AuthorizeAttribute authorize = (AuthorizeAttribute)filterList.FirstOrDefault(v => v is AuthorizeAttribute);
if (authorize != null)
{
authorize.OnAuthorization();
}
// 方法执行前
var actionList = filterList.Where(v => v is ActionFilterAttribute);
foreach (var item in actionList)
{
((ActionFilterAttribute)item).OnActionExecuting();
}
// 这里执行方法
method.Invoke(instance, parameters);
// 方法执行后
foreach (var item in actionList)
{
((ActionFilterAttribute)item).OnActionExecuted();
}
}
catch (Exception ex)
{
// 异常捕捉,包括整个动作
HandleErrorAttribute handleError = (HandleErrorAttribute)filterList.FirstOrDefault(v => v is HandleErrorAttribute);
if (handleError != null)
{
handleError.OnException();
}
}
}
}
}
}
注册
namespace Study.CustomMVCAttribute
{
public class Student
{
[Authorize]
[ActionFilter]
[HandleError]
public void Study()
{
Console.WriteLine($"正在学习");
}
}
}
调用
Student student = new Student();
ControllerActionInvoker.InvokeAction(student, "Study");
仿 MVC 三大特性的更多相关文章
- 重温PHP面向对象的三大特性
PHP面向对象的三大特性:封装性.继承性.多态性. 1. 封装性: 也称为信息隐藏,就是将一个类的使用和实现分开,只保留部分接口和方法与外部联系,或者说只公开了一些供开发人员使用的方法. 于是开发人员 ...
- Fis3的前端工程化之路[三大特性篇之声明依赖]
Fis3版本:v3.4.22 Fis3的三大特性 资源定位:获取任何开发中所使用资源的线上路径 内容嵌入:把一个文件的内容(文本)或者base64编码(图片)嵌入到另一个文件中 依赖声明:在一个文本文 ...
- Fis3的前端工程化之路[三大特性篇之资源定位]
Fis3版本:v3.4.22 Fis3的三大特性 资源定位:获取任何开发中所使用资源的线上路径 内容嵌入:把一个文件的内容(文本)或者base64编码(图片)嵌入到另一个文件中 依赖声明:在一个文本文 ...
- Fis3的前端工程化之路[三大特性篇之内容嵌入]
Fis3版本:v3.4.22 Fis3的三大特性 资源定位:获取任何开发中所使用资源的线上路径 内容嵌入:把一个文件的内容(文本)或者base64编码(图片)嵌入到另一个文件中 依赖声明:在一个文本文 ...
- JS三大特性
抽象 在分析三大特性之前我们要先了解什么叫抽象. 定义: 在定义一个类的时候,实际上就是把一类事物的共有的属性和行为提取出来,形成一个物理模型(模板),这种研究问题的方法就称为抽象 一.封装 定义: ...
- Java 浅析三大特性之一继承
上文Java 浅析三大特性之一封装我们说到Java是一个注重编写类,注重于代码和功能复用的语言.Java实现代码复用的方式有很多,这里介绍一个重要的复用方式--继承. 在介绍继承之前,我们要明确一点, ...
- 前端学PHP之面向对象系列第三篇——三大特性
× 目录 [1]封装 [2]继承[3]多态 前面的话 php面向对象编程的三大特性是封装性.继承性和多态性.本文将介绍php的这三大特性 封装 封装就是把对象中的成员属性和成员方法加上访问修饰符( p ...
- 第9章 Java类的三大特性之一:继承
1.什么是继承 子类继承父类就是对父类的扩展,继承时会自动拥有父类所拥有的处private之外的所有成员作用:增加代码复用语法格式: class 子类名 extends 父类名{…………}第9章 Ja ...
- 黑马程序员_ Objective-c 概述及面向对象与三大特性
-----------android培训.java培训.java学习型技术博客.期待与您交流!------------ (一).语法概述 1. oc介绍:(.m文件) 1> c语言的基础上,增加 ...
- 谈谈Java面向对象的三大特性
Java面向对象的三大特性就是指封装.继承.多态了. 一.封装: 概念:封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式. (举例:笔记本电脑就是一个封装体,Java语言中最小的封装体就是函数 ...
随机推荐
- CORS与CSRF在Spring Security中的使用
背景 在项目使用了Spring Security之后,很多接口无法访问了,从浏览器的网络调试窗看到的是CORS的报错和403的报错 分析 我们先来看一下CORS是什么,和它很相似的CSRF是什么,在S ...
- 简易博客页面小项目 html css
项目预览 代码 html: <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...
- Sqlserver分布式跨数据库查询、Join,以及分布式事务
简言: 这篇文章我要谈一谈SQL Server分布式跨服务器查询,多表Join,以及分布式事务的处理 SqlServer跨服务器查询的方式 以往自己才疏学浅,学习了一波之后,在这记录下来. 1. 使用 ...
- 【ASP.NET Core】MVC操作方法如何绑定Stream类型的参数
咱们都知道,MVC在输入/输出中都需要模型绑定.因为HTTP请求发送的都是文本,为了使其能变成各种.NET 类型,于是在填充参数值之前需 ModelBinder 的参与,以将文本转换为 .NET 类型 ...
- 甜点cc的2022年回顾总结
每每到年底,总会感概时间飞逝,总会莫名的心慌几天. 高中时代我就明白了一个道理:自己决定做的事,就算结果再烂以后也不要后悔,因为那无异于否定过去的自己.人不能总是否定自己的过去,因为我觉得这样会打击自 ...
- S2-032 CVE-2016-3081 远程代码执行
漏洞名称 CVE-2016-3081 S2-032 远程代码执行 利用条件 Struts 2.3.20 - Struts Struts 2.3.28 ( 2.3.20.3 和 2.3.24.3 除外) ...
- 为什么要虚拟化,为什么要容器,为什么要Docker,为什么要K8S?
前言 如标题中的问题所提到的虚拟化,容器,Docker和K8s那样,我们不妨这样问:这些技术到底适用于哪些场景,有没有别的技术可以替代?这些技术的优劣在哪里? 下面我将针对性地从以上几个问题的出发点, ...
- 使用阿里云产品搭建PHPWIND
2.4 安装PhpWind论坛网站 1. 本小节主要是在ECS云主机中快速安装PhpWind论坛网站的基础环境. 2. 远程登录到 PhpWind 主机服务器 ECS实例.请使用本实验 ...
- C語言成績分析系統
C語言成績分析系統,可以實現七個功能.(使用的編譯器是 code::blocks) 主要實現對於學生信息的輸入 顯示輸入學生的信息 根據期末成績來進行排名. 查找某個學生的信息 刪除某個學生的信息 修 ...
- (23)go-micro微服务客户端开发(使用负载均衡)
目录 一 main.go开发 二 客户端代码开发: 三 客户端测试功能 1.发送注册邮件 2.实现注册功能 3.查询用户功能 四 运行项目 五 最后 一 main.go开发 至此,咱们的项目服务端代码 ...