[关闭]
@Aiti 2020-03-09T09:44:42.000000Z 字数 3103 阅读 259

c# 知识点

c#


1、对象对于引用非静态字段、方法或属性是必需的(依赖注入)

非静态类的方法是不能直接调用的,需要实例化去调用。不建议把非静态类的方法改为静态的。
“static都是在类初始化的时候加载的,而非静态的变量都是在对象初始化的时候加载。所以中间可能会出现数值变化。
例如:

  1. public class Boos
  2. {
  3. public int nums = 10;
  4. public int GetNums()
  5. {
  6. return nums;
  7. }
  8. }
  9. public class User
  10. {
  11. public void UserBooks()
  12. {
  13. Boos.GetNums();//这里会提示对象对于引用非静态字段、方法或属性是必需的
  14. }
  15. }

(1)这里可以实例化去调用

  1. public class Boos
  2. {
  3. public int nums = 10;
  4. public int GetNums()
  5. {
  6. return nums;
  7. }
  8. }
  9. public class User
  10. {
  11. public void UserBooks()
  12. {
  13. Boos boos = new Boos();
  14. boos.GetNums();//实例化调用
  15. }
  16. }

(2)依赖注入

  1. public class Boos
  2. {
  3. public int nums = 10;
  4. public int GetNums()
  5. {
  6. return nums;
  7. }
  8. }
  9. public class User
  10. {
  11. private Boos bopos;
  12. //构造函数依赖注入
  13. public User(Boos boos){
  14. this.boos = boos;
  15. }
  16. public void UserBooks()
  17. {
  18. boos.GetNums();//依赖注入调用
  19. }
  20. }

2、Asp.Net Core 设置API错误信息统一返回值,返回状态码始终为200

  1. *(1)使用中间件进行异常捕获并且修改其返回值
  2. 异常过滤器
  3. /// <summary>
  4. /// 异常过滤器
  5. /// </summary>
  6. public class ErrorFilter :Attribute,IExceptionFilter
  7. {
  8. ILogger<ErrorFilter> logger;//这是日志记录
  9. /// <summary>
  10. /// 标签
  11. /// </summary>
  12. public ErrorFilter() {
  13. }
  14. /// <summary>
  15. /// 全局配置(logger使用依赖注入)
  16. /// </summary>
  17. /// <param name="logger4"></param>
  18. public ErrorFilter(ILogger4<ErrorFilter> logger) {
  19. this.logger = logger;
  20. }
  21. public void OnException(ExceptionContext context)
  22. {
  23. var e = context.Exception;
  24. logger4.LogError(e, e.Message + "\r\n" + e.StackTrace);
  25. context.Result = new JsonResult(e.Message);
  26. }
  27. }
  28. *(2)方法过滤器
  29. /// <summary>
  30. /// 对打上该标记的 返回结果为JsonResult的请求进行Result包装
  31. /// </summary>
  32. public class ApiResultFilter : Attribute, IActionFilter
  33. {
  34. /// <summary>
  35. /// 执行方法体之后
  36. /// </summary>
  37. /// <param name="context"></param>
  38. public void OnActionExecuted(ActionExecutedContext context)
  39. {
  40. var result = context.Result;
  41. if (result!=null &&result is JsonResult resulta)
  42. {
  43. context.Result = new JsonResult(resulta.Value);
  44. }
  45. }
  46. /// <summary>
  47. /// 执行方法体之前
  48. /// </summary>
  49. /// <param name="context"></param>
  50. public void OnActionExecuting(ActionExecutingContext context)
  51. {
  52. //不做修改
  53. }
  54. }
  55. *(3)可以使用标签的方法
  56. /// <summary>
  57. /// 测试 返回过滤器
  58. /// </summary>
  59. /// <returns></returns>
  60. [ErrorFilter]
  61. [ApiResultFilter]
  62. [HttpGet]
  63. public IActionResult TestReuslt()
  64. {
  65. throw new Exception("AA");
  66. var obj = new
  67. {
  68. A = "321"
  69. };
  70. return Json(obj);
  71. }
  72. 也可以使用全局配置的方法
  73. //注册过滤器
  74. services.AddSingleton<ApiResultFilter>();
  75. services.AddSingleton<ErrorFilter>();
  76. services.AddMvc(
  77. config => {
  78. config.Filters.AddService(typeof(ApiResultFilter));
  79. config.Filters.AddService(typeof(ErrorFilter));
  80. })
  81. .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
  82. 注意:
  83. 打上的标签无法获取IOC容器
  84. 不要使用全局配置与标签一起使用 会造成多次调用

自己的理解
**(1)对于以上两种过滤器方法ErrorFilter(异常处理) 和 ApiResultFilter(返回结果处理) 继承的两个接口都可以合并一个,分别是

ExceptionFilterAttribute(这个继承了标签接口Attribute和异常控制器接口IExceptionFilter)

ActionFilterAttribute(这个继承了标签接口Attribute 和 返回结果处理控制器接口IActionFilter)

**(2)
2.1如果在异常处理过滤器里面直接对ExceptionContext的对象excontext的Result进行赋值(值类型为JsonResult类型),那么返回处理结果控制器就不需要处理了。会直接返回我们给的Result。这个
2.2也可对在ErrorFilter异常处理过滤器里面直接对ExceptionContext的对象excontext的Result进行赋值(值类型为ContentResult类型),这个可以改变返回状态码和返回值。如下面第三大点。

3、asp.net core webapi异常返回值处理

基于第二点,在捕获异常处理时,直接给context.Result的包含状态码和错误信息的ContentResult对象。这样在返回结果时就不用处理了。

  1. /// <summary>
  2. /// 异常处理
  3. /// </summary>
  4. public class ApiExceptionFilterAttribute: ExceptionFilterAttribute
  5. {
  6. public override void OnException(ExceptionContext context)
  7. {
  8. if (context.Exception.Message.Contains("错误信息"))
  9. {
  10. if (context.Exception.Message.StartsWith("403错误信息"))
  11. {
  12. context.Result = new ContentResult
  13. {
  14. StatusCode = 403,
  15. Content = "用户没有权限执行此操作"
  16. };
  17. }
  18. }
  19. base.OnException(context);
  20. }
  21. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注