@Aiti
2020-03-09T09:44:42.000000Z
字数 3103
阅读 292
c#
非静态类的方法是不能直接调用的,需要实例化去调用。不建议把非静态类的方法改为静态的。
“static都是在类初始化的时候加载的,而非静态的变量都是在对象初始化的时候加载。所以中间可能会出现数值变化。
例如:
public class Boos{public int nums = 10;public int GetNums(){return nums;}}public class User{public void UserBooks(){Boos.GetNums();//这里会提示对象对于引用非静态字段、方法或属性是必需的}}
(1)这里可以实例化去调用
public class Boos{public int nums = 10;public int GetNums(){return nums;}}public class User{public void UserBooks(){Boos boos = new Boos();boos.GetNums();//实例化调用}}
(2)依赖注入
public class Boos{public int nums = 10;public int GetNums(){return nums;}}public class User{private Boos bopos;//构造函数依赖注入public User(Boos boos){this.boos = boos;}public void UserBooks(){boos.GetNums();//依赖注入调用}}
*(1)使用中间件进行异常捕获并且修改其返回值异常过滤器/// <summary>/// 异常过滤器/// </summary>public class ErrorFilter :Attribute,IExceptionFilter{ILogger<ErrorFilter> logger;//这是日志记录/// <summary>/// 标签/// </summary>public ErrorFilter() {}/// <summary>/// 全局配置(logger使用依赖注入)/// </summary>/// <param name="logger4"></param>public ErrorFilter(ILogger4<ErrorFilter> logger) {this.logger = logger;}public void OnException(ExceptionContext context){var e = context.Exception;logger4.LogError(e, e.Message + "\r\n" + e.StackTrace);context.Result = new JsonResult(e.Message);}}*(2)方法过滤器/// <summary>/// 对打上该标记的 返回结果为JsonResult的请求进行Result包装/// </summary>public class ApiResultFilter : Attribute, IActionFilter{/// <summary>/// 执行方法体之后/// </summary>/// <param name="context"></param>public void OnActionExecuted(ActionExecutedContext context){var result = context.Result;if (result!=null &&result is JsonResult resulta){context.Result = new JsonResult(resulta.Value);}}/// <summary>/// 执行方法体之前/// </summary>/// <param name="context"></param>public void OnActionExecuting(ActionExecutingContext context){//不做修改}}*(3)可以使用标签的方法/// <summary>/// 测试 返回过滤器/// </summary>/// <returns></returns>[ErrorFilter][ApiResultFilter][HttpGet]public IActionResult TestReuslt(){throw new Exception("AA");var obj = new{A = "321"};return Json(obj);}也可以使用全局配置的方法//注册过滤器services.AddSingleton<ApiResultFilter>();services.AddSingleton<ErrorFilter>();services.AddMvc(config => {config.Filters.AddService(typeof(ApiResultFilter));config.Filters.AddService(typeof(ErrorFilter));}).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);注意:打上的标签无法获取IOC容器不要使用全局配置与标签一起使用 会造成多次调用
自己的理解
**(1)对于以上两种过滤器方法ErrorFilter(异常处理) 和 ApiResultFilter(返回结果处理) 继承的两个接口都可以合并一个,分别是
ExceptionFilterAttribute(这个继承了标签接口Attribute和异常控制器接口IExceptionFilter)
和
ActionFilterAttribute(这个继承了标签接口Attribute 和 返回结果处理控制器接口IActionFilter)
**(2)
2.1如果在异常处理过滤器里面直接对ExceptionContext的对象excontext的Result进行赋值(值类型为JsonResult类型),那么返回处理结果控制器就不需要处理了。会直接返回我们给的Result。这个
2.2也可对在ErrorFilter异常处理过滤器里面直接对ExceptionContext的对象excontext的Result进行赋值(值类型为ContentResult类型),这个可以改变返回状态码和返回值。如下面第三大点。
基于第二点,在捕获异常处理时,直接给context.Result的包含状态码和错误信息的ContentResult对象。这样在返回结果时就不用处理了。
/// <summary>/// 异常处理/// </summary>public class ApiExceptionFilterAttribute: ExceptionFilterAttribute{public override void OnException(ExceptionContext context){if (context.Exception.Message.Contains("错误信息")){if (context.Exception.Message.StartsWith("403错误信息")){context.Result = new ContentResult{StatusCode = 403,Content = "用户没有权限执行此操作"};}}base.OnException(context);}}