【问题标题】:Configuring ASP .NET MVC Core controller instantiation without using ConfigureServices在不使用 ConfigureServices 的情况下配置 ASP .NET MVC Core 控制器实例化
【发布时间】:2017-05-29 15:42:31
【问题描述】:

在 OWIN 的美好时光中,在 aspnet core 之前,可以通过传入一个 HttpConfiguration 对象来配置 ASP.NET WebApi。在那里可以配置 ControllerActivator 等...如果您愿意...例如

appBuilder.UseWebApi(webApiConfig)

在 ASP.NET MVC Core 中是否有类似的方法可以做到这一点,避免使用 WebHostBuilder(直接或通过启动约定)?

例如不使用类似的东西:

var host = new WebHostBuilder()             
.ConfigureServices(serviceCollection => 
    serviceCollection.AddSingleton<IControllerActivator>(new 
    ControllerActivator()))

(唯一可以在 .UseMVC 上使用的重载需要一个 IRouteBuilder ......或者有没有办法到达 ServiceCollection 来操作 ControllerActivator?)

编辑:

可以选择使用 ServiceCollection 类创建 IServiceProvider。然后可以将 IServiceProvider 作为参数传递给 ApplicationBuilder,如下所示:

var serviceCollection = new ServiceCollection();
            serviceCollection.AddMvcCore();
            var serviceProvider = serviceCollection
                .AddSingleton<IControllerActivator>(new ControllerActivator())
                .AddLogging()
                .BuildServiceProvider();

            ApplicationBuilder builder = new ApplicationBuilder(serviceProvider);
            builder.UseMvc();

            return builder.Build();

但是,这让我有一个例外:

System.InvalidOperationException: Unable to resolve service for type 'Microsoft.Extensions.Options.IOptions`1[Microsoft.AspNetCore.Mvc.MvcOptions]' while attempting to activate 'Microsoft.AspNetCore.Mvc.ModelBinding.ModelBinderFactory'

进一步调查......

【问题讨论】:

  • 看起来像一个 XY 问题,你到底想达到什么目的?
  • 我创建了一个HttpMessageHandler,它可以接受一个RequestDelegate(或中间件),以便可以使用HttpClient(Damian Hickey 的OwinHttpMessageHandler 的一个端口)直接调用它。现在,在“旧”OWIN 堆栈中,可以在设置请求/中间件管道时直接传入 HttpConfiguration...我想做类似的事情...

标签: c# asp.net-core-mvc


【解决方案1】:

所以...需要提供一些必需的服务才能至少让管道无例外地运行。我的主要目标是添加一个自定义 IControllerActivator。这就是我最终得到的结果(在查看 WebHostBuilder source code 之后):

 var listener = new DiagnosticListener("Microsoft.AspNetCore");
 var serviceCollection = new ServiceCollection();
 serviceCollection.AddMvcCore();

 var serviceProvider = serviceCollection
     .AddSingleton<IControllerActivator>(new ControllerActivator())
     .AddLogging()
     .AddSingleton<DiagnosticSource>(listener)
     .AddOptions()
     .AddSingleton<ObjectPoolProvider, DefaultObjectPoolProvider>()
     .BuildServiceProvider();

...

 ApplicationBuilder builder = new ApplicationBuilder(serviceProvider);
 builder.UseMvc();

 return builder.Build();

...

希望它对某人有所帮助..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 2023-03-18
    • 2021-03-12
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多