webapi Swagger 配置 services.BuildServiceProvider() 报警 ASP0000 问题处理

问题起源

网上的常见配置 Swagger 配置 在Startup类的 ConfigureServices 使用 services.BuildServiceProvider() ,其中有段代码如下:

  var provider = services.BuildServiceProvider().GetRequiredService<IApiVersionDescriptionProvider>();

会报 ASP0000,大致意思是:从应用程序代码调用"BuildServiceProvider"会导致正在创建的单个服务的额外副本。将依赖项注入服务等替代方法视为"配置"的参数。详细解释

大概意思明了了,那如何处理呢?

处理方法

原代码示例


            services.AddSwaggerGen(options =>
            {
                options.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());

                var provider = services.BuildServiceProvider().GetRequiredService<IApiVersionDescriptionProvider>();

                // 添加文档信息
                foreach (var item in provider.ApiVersionDescriptions)
                {
                    // 添加文档信息
                    options.SwaggerDoc(item.GroupName, new OpenApiInfo
                    {
                        Version = item.ApiVersion.ToString(),
                        Title = Config.SiteInfo.ApiSiteName,
                        Description = Config.SiteInfo.ApiSiteDesc,
                        Contact = new OpenApiContact
                        {
                            Name = Config.SiteInfo.ApiContactName,
                            Email = Config.SiteInfo.ApiContactEmail,
                        }
                    });
                }

                //需要设置api的项目属性,生成中输出xml文件               
                var xmlPath = Path.Combine(AppContext.BaseDirectory, $"{AppDomain.CurrentDomain.FriendlyName}.xml");
                options.IncludeXmlComments(xmlPath);
            });

修改后的代码


            services.AddSwaggerGen();
            services.AddOptions<SwaggerGenOptions>()
                .Configure<IApiVersionDescriptionProvider>((options, service) =>
            {
                options.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());
                // 添加文档信息
                foreach (var item in service.ApiVersionDescriptions)
                {
                    // 添加文档信息
                    options.SwaggerDoc(item.GroupName, new OpenApiInfo
                    {
                        Version = item.ApiVersion.ToString(),
                        Title = Config.SiteInfo.ApiSiteName,
                        Description = Config.SiteInfo.ApiSiteDesc,
                        Contact = new OpenApiContact
                        {
                            Name = Config.SiteInfo.ApiContactName,
                            Email = Config.SiteInfo.ApiContactEmail,
                        }
                    });
                }

                //需要设置api的项目属性,生成中输出xml文件               
                var xmlPath = Path.Combine(AppContext.BaseDirectory, $"{AppDomain.CurrentDomain.FriendlyName}.xml");
                options.IncludeXmlComments(xmlPath);
            });

注意

Config.SiteInfo 是我项目中的封装的一个静态属性的类,大家可以根据自己情况做相应处理。

posted @ 2021-01-22 11:45  TakeTry  阅读(1276)  评论(0编辑  收藏  举报