#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 Я только что внес улучшения в пакет интеграции. В следующем выпуске будет выдано исключение с сообщением, которое лучше объяснит проблему и способы решения этой проблемы.