.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
原文地址:https://www.cnblogs.com/ives/p/15691062.html