ApiExplorer для контроллеров WebAPI во внешней сборке

Мои контроллеры WebApi находятся в сборке (собственное приложение OWIN или приложение ASP MVC). Можно ли использовать ApiExplorer из другого приложения (которое динамически загружает сборку с контроллерами WebApi) для создания документации по Web API?

1 ответ

ApiExplorer использует GlobalConfiguration для определения доступных ApiControllers. Когда вы указываете внешнюю сборку, вы обычно делаете это, заменяя IAssemblyResolver, который использует WebApi. Это можно сделать в Application_Start следующим образом:

  protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        UnityConfig.RegisterComponents();

        GlobalConfiguration.Configuration.Services.Replace(typeof(IAssembliesResolver), new AssemblyResolver());

        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);

        GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
    }

Вот реализация AssemblyResolver:

public class AssemblyResolver : System.Web.Http.Dispatcher.DefaultAssembliesResolver
    {
        public override ICollection<Assembly> GetAssemblies()
        {
            ICollection<Assembly> baseAssemblies = base.GetAssemblies();
            List<Assembly> assemblies = new List<Assembly>(baseAssemblies);

            var externalAssembly = typeof(MyApp.External).Assembly;
            assemblies.Add(externalAssembly);

            return baseAssemblies;
        }
    }

Можно подумать, что ApiExplorer этого достаточно, чтобы поднять его, но это не так. Когда ApiExplorer запускается, GlobalConfiguration передается в HelpController. Если вы внимательно посмотрите на экземпляр GlobalConfiguration, вы увидите, что изменений, которые вы затронули в Application_Start, там нет. Итак, чтобы ApiExplorer мог подобрать ваш внешний класс, вы можете просто обновить IAssemblyResolver следующим образом:

public HelpController(HttpConfiguration config)
    {
        GlobalConfiguration.Configuration.Services.Replace(typeof(IAssembliesResolver), new AssemblyResolver());

        Configuration = config;
    }

Вероятно, есть более чистый способ сделать это, чтобы вы не сломали DRY - но еще не нашли его. Обновлю этот пост, когда найду.

Другие вопросы по тегам