gpt4 book ai didi

c# - 是否有与旧 WebApi IHttpControllerTypeResolver 等效的 AspNetCore?

转载 作者:行者123 更新时间:2023-11-30 16:40:52 31 4
gpt4 key购买 nike

在 WebApi 中,您可以替换内置的 IHttpControllerTypeResolver,您可以在其中以任何您喜欢的方式找到您想要的 Api Controller 。

在带有 MVC 的 AspNetCore 中,PartsManagers 和 FeatureManagers 困惑不堪,其中某处与 Controller 有关。我能够找到的所有文档和讨论似乎都假设您是一名从事 MVC 本身工作的开发人员,并且您已经了解 ApplicationPartManager 和 ControllerFeatureProvider 之间的区别,而无需解释任何内容。

在最简单的示例中,我特别想做的是启动 AspNetCore 2.0 Kestrel 服务器的实例,并让它仅解析预配置的硬编码单个 Controller 。我明确地不希望它进行正常的发现等等。

在 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只识别您想要的 Controller 。

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 Generic Controllers in ASP.NET Core

关于c# - 是否有与旧 WebApi IHttpControllerTypeResolver 等效的 AspNetCore?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50381426/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com