Is there an AspNetCore equivalent of the old WebApi IHttpControllerTypeResolver?(有没有AspNetCore等同于旧的WebApi IHttpControllerTypeResolver?)
问题描述
在WebApi中,您可以替换内置的IHttpControllerTypeResolver
,其中您可以随心所欲地找到您想要的Api控制器。
在AspNetCore和MVC中,有一堆令人困惑的PartsManager和FeatureManager,其中的某个地方与控制器有关。我所能找到的所有文档和讨论似乎都假定您是一名从事MVC本身工作的开发人员,并且您已经了解了ApplicationPartManager和ControllerFeatureProvider之间的区别,而无需解释任何内容。 在最简单的示例中,我特别想做的是启动AspNetCore2.0Kestrel服务器的一个实例,并让它只解析预配置的硬编码单一控制器。我明确地不想让它做这是正常的发现和所有的事情。
在WebApi中,您刚刚完成了以下操作:
public class SingleControllerTypeResolver : IHttpControllerTypeResolver
{
readonly Type m_type;
public SingleControllerTypeResolver(Type type) => m_type = type;
public ICollection<Type> GetControllerTypes(IAssembliesResolver assembliesResolver) => new[] { m_type };
}
// ...
// in the configuration:
config.Services.Replace(typeof(IHttpControllerTypeResolver), new SingleControllerTypeResolver(typeof(MySpecialController)))
然而,我在尝试使用aspnetcore 2获取等效项时遇到了困难
推荐答案
创建该功能似乎很简单,因为您可以从默认ControllerFeatureProvider
派生并覆盖IsController
以仅识别所需的控制器。
public class SingleControllerFeatureProvider : ControllerFeatureProvider {
readonly Type m_type;
public SingleControllerTypeResolver(Type type) => m_type = type;
protected override bool IsController(TypeInfo typeInfo) {
return base.IsController(typeInfo) && typeInfo == m_type.GetTypeInfo();
}
}
下一部分是在启动期间将默认提供程序替换为您自己的提供程序。
public void ConfigureServices(IServiceCollection services) {
//...
services
.AddMvc()
.ConfigureApplicationPartManager(apm => {
var originals = apm.FeatureProviders.OfType<ControllerFeatureProvider>().ToList();
foreach(var original in originals) {
apm.FeatureProviders.Remove(original);
}
apm.FeatureProviders.Add(new SingleControllerFeatureProvider(typeof(MySpecialController)));
});
//...
}
如果认为覆盖默认实现不够显式,则可以直接实现IApplicationFeatureProvider<ControllerFeature>
并自己提供PopulateFeature
。
public class SingleControllerFeatureProvider
: IApplicationFeatureProvider<ControllerFeature> {
readonly Type m_type;
public SingleControllerTypeResolver(Type type) => m_type = type;
public void PopulateFeature(
IEnumerable<ApplicationPart> parts,
ControllerFeature feature) {
if(!feature.Controllers.Contains(m_type)) {
feature.Controllers.Add(m_type);
}
}
}
参考Application Parts in ASP.NET Core: Application Feature Providers参考Discovering核心中的通用控制器
这篇关于有没有AspNetCore等同于旧的WebApi IHttpControllerTypeResolver?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:有没有AspNetCore等同于旧的WebApi IHttpControllerTypeResolver?
基础教程推荐
- 如何激活MC67中的红灯 2022-01-01
- 将 XML 转换为通用列表 2022-01-01
- 有没有办法忽略 2GB 文件上传的 maxRequestLength 限制? 2022-01-01
- 将 Office 安装到 Windows 容器 (servercore:ltsc2019) 失败,错误代码为 17002 2022-01-01
- c# Math.Sqrt 实现 2022-01-01
- MS Visual Studio .NET 的替代品 2022-01-01
- rabbitmq 的 REST API 2022-01-01
- SSE 浮点算术是否可重现? 2022-01-01
- 如何在 IDE 中获取 Xamarin Studio C# 输出? 2022-01-01
- 为什么Flurl.Http DownloadFileAsync/Http客户端GetAsync需要 2022-09-30