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 是我項目中的封裝的一個靜態屬性的類,大家可以根據自己情況做相應處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章