@Aiti
2020-03-09T09:44:42.000000Z
字数 3103
阅读 259
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);
}
}