2017-05-26 3 views
1

In den guten alten Tagen von OWIN, vor Aspnet-Core, könnte man ASP.NET WebApi konfigurieren, indem man ein HttpConfiguration-Objekt übergibt. Dort könnte man unter anderem den ControllerActivator etc ... konfigurieren, wenn Sie ... möchten.ASP.NET MVC Core Controller Instanziierung konfigurieren, ohne ConfigureServices zu verwenden

appBuilder.UseWebApi(webApiConfig) 

Gibt es eine ähnliche Art und Weise man dies in ASP.NET MVC-Core tun kann, die mit dem WebHostBuilder (entweder direkt oder über die StartUp-Konvention) zu vermeiden?

z.B. so etwas wie ohne Verwendung:

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

(Die einzigen Überlastungen eines auf .UseMVC verwenden nimmt eine IRouteBuilder ... Oder gibt es eine Möglichkeit, um die ServiceCollection zu bekommen das ControllerActivator zu manipulieren?)

EDIT:

Es gibt eine Option zum Erstellen eines IServiceProvider mit der ServiceCollection-Klasse. Die IServiceProvider kann dann wie so als Argument an die Applicationübergeben werden:

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(); 

Doch dies lässt mich mit als Ausnahme:

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' 

weitere Untersuchung ....

+1

Scheint ein XY-Problem, was willst du eigentlich erreichen? – DavidG

+0

Ich habe einen [HttpMessageHandler] (https://github.com/MCGPPeters/Aranea.HttpMessageHandler) erstellt, der ein RequestDelegate (oder Middleware) nehmen kann, so dass es direkt mit einem HttpClient (ein Port von Damian Hickey's [ OwinHttpMessageHandler] (https://github.com/damianh/OwinHttpMessageHandler)). Jetzt, in der 'alten' OWIN-Stack, könnte man in der HttpConfiguration direkt beim Einrichten der Anfrage/Middleware-Pipeline übergeben ... Ich möchte etwas ähnliches tun ... –

Antwort

0

So. .. Es gibt ein paar erforderliche Dienste, die vorhanden sein müssen, um zumindest die Pipeline ohne Ausnahmen laufen zu lassen. Mein primäres Ziel war es, einen benutzerdefinierten IControllerActivator hinzuzufügen. Dies ist, was ich mit (nach spähen in WebHostBuilder source code) endete:

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(); 

...

Hoffe, dass es jemand hilft ..

Verwandte Themen