Как генерировать динамические пути, или возможные значения параметров в swagger, которые генерируются во время выполнения? - PullRequest
0 голосов
/ 31 мая 2018

У меня есть Web Api с шаблоном URL: 'TestEmail / Render / {templateName}', где возможные значения параметра templateName определяются во время выполнения с использованием отражения.

public class TestEmailController : Controller
{
    public static IEnumerable<Type> AllNotificationTypes =>
       typeof(INotification).Assembly.GetTypes()
           .Where(t => typeof(INotification).IsAssignableFrom(t) && !t.IsAbstract);

    [HttpGet("[controller]/{templateName}")]
    public async Task<IActionResult> Render(string templateName)
    {
        Type templateType = AllNotificationTypes.FirstOrDefault(t => t.Name == templateName);
        if (templateType == null) return NotFound();
        string renderedHtml = ...
        return Content(renderedHtml, "text/html");
    }   
}

Как отобразить возможные значенияв файле swagger с использованием Swashbuckle.AspNetCore?


EDIT : Вдохновленный ответом HelperSepu, я получил:

[SwaggerOperationFilter(typeof(TemplateNameOperationFilter))]
[HttpGet("[controller]/{templateName}")]
public async Task<IActionResult> Render(string templateName)
{ 
....


public class TemplateNameOperationFilter : IOperationFilter
{
    public void Apply(Operation operation, OperationFilterContext context)
    {
        var param = (PartialSchema)operation.Parameters.First(o => o.Name == "templateName");
        param.Enum = TestEmailController.AllNotificationTypes.Select(type => (object)type.Name).ToList();
    }
}

1 Ответ

0 голосов
/ 01 июня 2018

Я думал об этом, и хорошим вариантом будет поставить затем как enum, используя IDocumentFilter

public class MyDocFilter : IDocumentFilter
{
  public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context)
  {
    PathItem path = swaggerDoc.Paths.Where(x => x.Key.Contains("TestEmail")).First().Value;
    var p = (NonBodyParameter)path.Get.Parameters.Where(x => x.Name == "templateName").First();
    p.Enum = new List<object>();
    foreach (var item in TestEmailController.AllNotificationTypes.Select(x => x.Name))
    {
      p.Enum.Add(item);
    }
  }
}

И это изменит пользовательский интерфейс, чтобы показать выпадающий список: enter image description here

...