Как зарегистрировать IViewComponentDescriptorProvider в .NET Core?

#c# #asp.net-core-mvc #simple-injector

#c# #asp.net-core-mvc #простой инжектор

Вопрос:

Я настроил внедрение зависимостей с помощью SimpleInjector таким же образом, как представлено здесь . К сожалению, вызов RegisterMvcViewComponents объекта контейнера вызывает исключение:

Нет службы для типа «Microsoft.AspNetCore.Mvc.ViewComponents.Зарегистрирован IViewComponentDescriptorProvider.

Есть ли у контейнера соответствующий метод для регистрации поставщика? Или это должно быть сделано каким-то другим способом?

Код:

 public class Startup
{
    private Container _container = new Container();

    public void ConfigureServices(IServiceCollection services)
    {
        services.InitializeTestData();

        services.AddMvcCore();

        services.AddSingleton<IControllerActivator>(new SimpleInjectorControllerActivator(_container));
        services.AddSingleton<IViewComponentActivator>(new SimpleInjectorViewComponentActivator(_container));           
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseSimpleInjectorAspNetRequestScoping(_container);
        _container.Options.DefaultScopedLifestyle = new AspNetRequestLifestyle();
        InitializeContainer(app);
        _container.Verify();

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "Default",
                template: "{controller=Home}/{action=Index}/{id?}"
            );
        });
    }

    private void InitializeContainer(IApplicationBuilder app)
    {
        _container.RegisterMvcControllers(app);
        _container.RegisterMvcViewComponents(app);

        _container.Register<IDbContext>(() => new DbContext("GuitarProject"));
        _container.Register<IJournalEntryRepository, JournalEntryRepository>();
    }
}
  

Трассировка стека (тип исключения InvalidOperationException ):

в Microsoft.Расширения.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(поставщик услуг IServiceProvider, введите ServiceType) в Microsoft.Расширения.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](поставщик услуг IServiceProvider) в SimpleInjector.SimpleInjectorAspNetCoreMvcIntegrationExtensions.Зарегистрируйте mvcviewcomponents(Container container, IApplicationBuilder applicationBuilder) в ProjectX.Startup.InitializeContainer(приложение IApplicationBuilder)

Комментарии:

1. Можете ли вы опубликовать полную трассировку стека?

2. Добавлена трассировка стека @Steven.

Ответ №1:

Измените следующую строку:

 services.AddMvcCore();
  

Для:

 services.AddMvc();
  

RegisterMvcViewComponent Метод простого инжектора требует IViewComponentDescriptorProvider , чтобы абстракция была зарегистрирована в ASP.NET Основная система конфигурации. Метод расширения использует IViewComponentDescriptorProvider , чтобы узнать, какие компоненты представления необходимо зарегистрировать. AddMvcCore() Однако вызываемый вами метод расширения не регистрирует это IViewComponentDescriptorProvider , поскольку AddMvcCore метод регистрирует только некоторые базовые функции; он не учитывает специфичные для просмотра данные. С AddMvc() другой стороны, метод расширения инициализирует весь пакет, включая материалы, связанные с представлением, такие как IViewComponentDescriptorProvider .

Если вас не интересуют компоненты просмотра, вы также можете опустить вызов RegisterMvcViewComponents() .

Комментарии:

1. Ваше решение устранило проблему. Я только сегодня начал изучать .NET Core, поэтому я действительно не знал, что я делал, когда устанавливал пакет MVC Core вместо того, который мне был нужен 🙂

2. @Kapol Я только что внес улучшения в пакет интеграции. В следующем выпуске будет выдано исключение с сообщением, которое лучше объяснит проблему и способы решения этой проблемы.