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