• .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
  • 相关阅读:
    EJB3.0
    EJB
    到底EJB是什么
    EJB到底是什么,真的那么神秘吗??
    ssh和ejb的区别
    struts2的一些小问题
    Struts2中ValueStack结构和总结
    Java 监听器
    浅谈cookie 和session 的区别
    理解Cookie和Session机制
  • 原文地址:https://www.cnblogs.com/ives/p/15691062.html
Copyright © 2020-2023  润新知