zoukankan      html  css  js  c++  java
  • .net5 过滤器返回通用结构 swagger使用IApplicationModelProvider自动化添加ProducesResponseType

    1. 创建通用返回结构及忽略特性
    public class ResultData<T>
            {
    			public int ret {get;set;}
    			public string msg {get;set;}
                public T Data { get; set; }
            }
    
      public class ApiIgnoreAttribute: Attribute
        {
        }
    
    1. 创建一个类继承IApplicationModelProvider
        public class ProduceResponseTypeModelProvider : IApplicationModelProvider
        {
            public int Order => 0;
    
            public void OnProvidersExecuted(ApplicationModelProviderContext context)
            {
            }
    
            public void OnProvidersExecuting(ApplicationModelProviderContext context)
            {
                foreach (ControllerModel controller in context.Result.Controllers)
                {
                    foreach (ActionModel action in controller.Actions)
                    {
                        if (!action.Filters.Any(e => (e is ProducesResponseTypeAttribute producesResponseType) && producesResponseType.StatusCode == StatusCodes.Status200OK))
                        {
                             //跳过带有ApiIgnoreAttribute的action
                            if (action.Attributes.Any(f => (f is ApiIgnoreAttribute)))
                            {
                                continue;
                            }
                            if (action.ActionMethod.ReturnType != null)
                            {
                                Type type = typeof(ResultData<>);
    
                                //忽略原先旧接口返回类型,后续可移除
                                if (action.ActionMethod.ReturnType.IsGenericType &&action.ActionMethod.ReturnType.GetGenericTypeDefinition() == type)
                                {
                                    continue;
                                } 
    
                                type = type.MakeGenericType(action.ActionMethod.ReturnType);
                                action.Filters.Add(new ProducesResponseTypeAttribute(type, StatusCodes.Status200OK));
                            }
                        }
                    }
                }
            }
        }
    
    
    1. startup中添加
    //注入
    services.TryAddEnumerable(ServiceDescriptor.Transient<IApplicationModelProvider, ProduceResponseTypeModelProvider>());
    

    参考:
    ProducesResponseType自动化

    留待后查,同时方便他人
    联系我:renhanlinbsl@163.com
  • 相关阅读:
    (78) C# System.Text.Json
    EF 迁移数据库
    element table
    element-plus 安装
    asp.net core 跨域
    JS常用公共方法 获取弹出层合适的宽高
    一篇文章让你搞懂如何通过Nginx来解决跨域问题
    Dubbo系列讲解之服务注册【3万字长文分享】
    Dubbo系列讲解之扩展点实现原理分析【2万字分享】
    MySQL索引篇之索引存储模型
  • 原文地址:https://www.cnblogs.com/ives/p/15691062.html
Copyright © 2011-2022 走看看