如何在www.example.com核心的字段中添加一个 Swagger 的例子asp.net?

pobjuy32  于 2022-11-06  发布在  .NET
关注(0)|答案(3)|浏览(129)

基于the Swagger documentation,我必须能够为我的类字段添加一些示例,例如:

但是我找不到任何方法将这些例子添加到我的类中。

q1qsirdb

q1qsirdb1#

您可以启用XML注解,然后使用<example>元素来定义示例。下面是使用<example>的示例:

public class CompanyValidationResponse
{
    /// <example>1234</example>
    public int CompanyId { get; set; }

    /// <example>Damage, Inc</example>
    public string CompanyName { get; set; }
}
sgtfey8w

sgtfey8w2#

首先,你需要在类中添加XML文档,下面是一个例子。

namespace WebApplication44
{
    /// <summary>
    /// Display Weather Forecast
    /// </summary>
    public class WeatherForecast
    {
        /// <summary>
        /// Date of the weather
        /// </summary>
        public DateTime Date { get; set; }

        /// <summary>
        /// Temperature in Degree Celesuis
        /// </summary>
        public int TemperatureC { get; set; }
        /// <summary>
        /// Temperature in Fahrenheit
        /// </summary>
        public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
        /// <summary>
        /// Summary of the Weather. It can be "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
        /// </summary>
        public string? Summary { get; set; }
    }
}

接下来,您需要在Visual Studio中的项目属性中启用Documentation File > Generate a File containing API documentation option-无需更改位置。
最后,修改swagger生成代码,如下所示。

var xmlDoc = Path.ChangeExtension(Assembly.GetExecutingAssembly().Location, "xml");
builder.Services.AddSwaggerGen(options => options.IncludeXmlComments(xmlDoc, true));

然后,您将能够看到这样的Open API文档。

xriantvc

xriantvc3#

添加多个项目的文档

我想添加一个解决方案,用于当所记录的类型不在您的主web/ api项目中,而是在其他 DomainModel 项目中时,如何显示示例和其他文档,正如应用Seperation of concerns所建议的那样。
我之所以遇到这个问题,是因为我通常使用MediatR将持有端点的 API 项目与驻留在 Domain 项目中的实际业务逻辑分离,但我的API可能会返回在 Domain 项目中定义的类型,因此我仍然希望记录返回的类型。
下面是多项目解决方案的外观(概念上):

My.Example.Project.sln
|- My.Example.Project.Api
|   |- ...
|   |- My.Example.Project.Api.csproj
|- My.Example.Project.Domain
|   |- ...
|   |- My.Example.Project.Domain.csproj

为了使其正常工作,您需要通过在相应的*.csproj文件中进行设置,为希望包含文档的每个项目启用XML文档的生成:

<PropertyGroup>
    <GenerateDocumentationFile>true</GenerateDocumentationFile>
    <!-- Optional: Disable warnings for missing XML doc comments -->
    <NoWarn>$(NoWarn);1591</NoWarn>
</PropertyGroup>

现在,在My.Example.Project.Domain项目中使用<example>记录模型/ DTO对象。

// A DTO in the domain project
namespace My.Example.Project.Domain.DTOs
{
    public class MyApiDto
    {
        /// <summary>
        /// Unique ID.
        /// </summary>
        /// <example>b521fb69-d6fc-4c20-83bf-46a3f391eb52</example>
        public Guid Id { get; set; }
        /// <summary>
        /// Name
        /// </summary>
        /// <example>John</example>
        public string Name { get; set; }
    }
}

当然,您将在My.Example.Project.Domain项目中记录您的API端点。

// A controller in the API project
namespace My.Example.Project.Api.Controllers
{
    [ApiController]
    [Route("api")]
    public class DtoController : ControllerBase
    {
        private readonly IMediator _mediator;
        public TextFilesController(IMediator mediator)
        {
            _mediator = mediator;
        }
        /// <summary>
        /// Gets the DTO.
        /// </summary>
        /// <response code="200">API got the DTO</response>
        [HttpGet("something/{id}", Name = nameof(GetDto))]
        [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(GetDtoResponse))]
        public async Task<ActionResult<GetDtoResponse>> GetDto(Guid id)
        {
            var request = new GetDtoRequest(id);
            var respone = await _mediator.Send(request); // returns the DTO from the Domain project
            return Ok(response);
        }
    }
}

现在您只需要配置Swagger Gen来查找所有项目的.xml文档文件,而不是像Microsoft文档中所示的那样只查找执行程序集的一个。

builder.Services.AddSwaggerGen(options =>
{
    options.SwaggerDoc("v1", new OpenApiInfo()
    {
        Version = "1.0.0",
        Title = "My Project API",
    });
    // Include docs from current API assembly (as described in MS Docs)
    var executingAssembly = Assembly.GetExecutingAssembly();
    options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, $"{executingAssembly.GetName().Name}.xml"));

    // Additionally include the documentation of all other "relevant" projects
    var referencedProjectsXmlDocPaths = executingAssembly.GetReferencedAssemblies()
        .Where(assembly => assembly.Name != null && assembly.Name.StartsWith("My.Example.Project", StringComparison.InvariantCultureIgnoreCase))
        .Select(assembly => Path.Combine(AppContext.BaseDirectory, $"{assembly.Name}.xml"))
        .Where(path => File.Exists(path));
    foreach (var xmlDocPath in referencedProjectsXmlDocPaths)
    {
        options.IncludeXmlComments(xmlDocPath);
    }
});

为了确定 “相关” 程序集,您可以在当前程序集上使用GetReferencedAssemblies()。由于您的API将返回您的域项目的类型,因此域程序集将在API项目中被引用。不幸的是,大量您尚未创建的其他程序集也将被返回。由于没有 * 我自己的程序集 * 的概念并且每个程序集都与任何其他程序集一样,筛选程序集的唯一方法是使用它们的名称,例如使用StartsWith()。然后像创建单个文件一样创建路径,最后检查文档.xml文件是否确实存在在API项目中引用了不生成.xml文档的项目。
最后但并非最不重要的一点是,遍历您刚刚创建的所有路径,并告诉Swagger Gen在使用options.IncludeXmlComments()生成OpenAPI规范时包括这些文件。
现在,当您启动解决方案时,应该会显示文档和示例。

相关问题