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 - но еще не нашли его. Обновлю этот пост, когда найду.