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?
基础教程推荐
- C# 从 List<List<int>> 中删除重 2022-01-01
- 如何使用 .Net 检查 Active Directory 服务器是否已启动并正在运行? 2022-01-01
- 我应该在后面的代码中直接使用 Linq To SQL 还是使 2022-01-01
- .NET SerialPort DataReceived 事件未触发 2022-01-01
- 当值可以是对象或空数组时反序列化 JSON 2022-01-01
- 如果有人提交恶意软件Nuget包怎么办? 2022-01-01
- 禁止输入少量字符,例如'<'、'&a 2022-01-01
- WPF 模态进度窗口 2022-01-01
- Azure Functions:CosmosDBTrigger 未在 Visual Studio 中触发 2022-01-01
- Moq It.Is<>不匹配 2022-01-01
