Существует ли AspNetCore-эквивалент старого WebApi IHttpControllerTypeResolver? - PullRequest
0 голосов
/ 17 мая 2018

В WebApi вы можете заменить встроенный IHttpControllerTypeResolver, в котором вы можете найти нужные вам контроллеры Api любым удобным для вас способом.

В AspNetCore с MVC есть запутанная путаница PartsManager и FeatureManager, и где-то есть что-то, что связано с контроллерами. Кажется, что вся документация и обсуждения, которые я смог найти, предполагают, что вы разработчик, работающий над MVC, и что вы уже понимаете разницу между ApplicationPartManager и ControllerFeatureProvider, ничего не объясняя.

Что я хотел бы сделать в простейшем примере, так это запустить экземпляр сервера AspNetCore 2.0 Kestrel и разрешить ему разрешать только предварительно сконфигурированный жестко закодированный отдельный контроллер. Я явно не хочу, чтобы это делалось, это нормальное открытие и все такое.

В 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

1 Ответ

0 голосов
/ 17 мая 2018

Создание функции кажется достаточно простым, поскольку вы можете извлечь из значения по умолчанию 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>();
            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);
        }
    }
}

Справочник Части приложения в ASP.NET Core: поставщики функций приложения
Ссылка Обнаружение универсальных контроллеров в ASP.NET Core

...