我的 WebApi 控制器位于程序集中(自托管 OWIN 应用程序或 ASP MVC 应用程序)。是否可以使用 ApiExplorer 形成另一个应用程序(动态加载带有 WebApi 控制器的程序集)来生成 Web API 文档?
问问题
1638 次
1 回答
0
ApiExplorer 使用 GlobalConfiguration 来确定可用的 ApiController。当您指定外部程序集时,您通常通过替换 WebApi 正在使用的 IAssemblyResolver 来执行此操作。这可以像这样在 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 - 但还没有找到它。当我找到它时会更新这个帖子。
于 2016-07-07T14:33:53.907 回答