我想为每个版本的API创建一个单独的帮助页面。例如,用户可以转到/ help?v = 1查看版本1.0路由和/ help?v = 2查看版本2.0路由。
使用SDammann.WebApi.Versioning
,我向Version
添加了VersionedApiExplorer
属性,该属性仅返回已定义版本的路由,并将版本作为参数添加到构造函数中。然后我尝试了这个:
config.Services.Add(typeof(IApiExplorer), new VersionedApiExplorer(config, "1"));
config.Services.Add(typeof(IApiExplorer), new VersionedApiExplorer(config, "2"));
但是这给了我以下错误:
The service type IApiExplorer is not supported.
Parameter name: serviceType
我只添加了一个服务实例 - config.Services.Replace(typeof(IApiExplorer), new VersionedApiExplorer(GlobalConfiguration.Configuration, "1"));
- 以使配置正常工作,因此我可以测试我的帮助控制器。然后尝试了这个:
foreach (var service in Configuration.Services.GetServices(typeof(IApiExplorer))) {
if (service.GetType() != typeof(VersionedApiExplorer)) continue;
var explorer = service as VersionedApiExplorer;
if (explorer.Version == v) {
apiExplorer = explorer;
}
}
这给出了我上面收到的相同错误。我知道我通常会使用this.Configuration.Services.GetApiExplorer()
,但我不知道如何使用它来获取VersionedApiExplorer
的相应实例。我知道我可以直接在控制器中实例化相应的ApiExplorer
,但如果可能的话,我宁愿将其保留在我的配置文件中。
所以我有两个问题:
VersionedApiExplorer
类型的两个服务添加到我的配置对象?或者我可以采取完全不同的方法来实现同样的目标吗?
谢谢!
答案 0 :(得分:0)
我最终选择了我在问题中暗示的解决方案。我觉得这是解决这个问题的更好方法,但这可以完成工作。
首先,我向Version
添加了VersionedApiExplorer
属性:
public string Version { get; private set; }
然后我修改了InitializeApiDescriptions
看起来像这样:
private Collection<ApiDescription> InitializeApiDescriptions()
{
Collection<ApiDescription> apiDescriptions = new Collection<ApiDescription>();
var controllerSelector = configuration.Services.GetHttpControllerSelector();
IDictionary<string, HttpControllerDescriptor> allControllerMappings = controllerSelector.GetControllerMapping();
IDictionary<string, HttpControllerDescriptor> controllerMappings = new Dictionary<string, HttpControllerDescriptor>();
// get only mappings for defined version
if (allControllerMappings != null && Version != null) {
foreach (var key in allControllerMappings.Keys) {
if (key.Substring(0, key.IndexOf('.')) == VersionedControllerSelector.VersionPrefix + Version) {
controllerMappings.Add(key, allControllerMappings[key]);
}
}
}
else if (Version == null) {
controllerMappings = allControllerMappings;
}
if (controllerMappings != null)
{
foreach (var route in configuration.Routes)
ExploreRouteControllers(controllerMappings, route, apiDescriptions);
}
return apiDescriptions;
}
我还添加了一个可用于设置版本的方法:
public void SetVersion(string version) {
this.Version = version;
this.apiDescription = new Lazy<Collection<ApiDescription>>(InitializeApiDescriptions);
}
最后,我将HelpController
修改为如下所示:
public ActionResult Index(string v) {
return this.View(GetApiExplorer(v).ApiDescriptions);
}
private IApiExplorer GetApiExplorer(string version) {
if (version == null) {
version = "1";
}
var apiExplorer = this.Configuration.Services.GetApiExplorer() as VersionedApiExplorer;
if (apiExplorer != null) {
apiExplorer.SetVersion(version);
}
return apiExplorer;
}