2017-02-05 32 views
5

Poszukiwanie odpowiedzi od starszego poziomu architekta ASP.NET, który zna wewnętrzne szczegóły ASP.NET MVC.Uzyskiwanie informacji o obiekcie Startup.cs

Oto szkielet standardowej aplikacji podstawowej ASP.NET.

var config = new ConfigurationBuilder() 
    .AddCommandLine(args) 
    .AddEnvironmentVariables(prefix: "ASPNETCORE_") 
    .Build(); 

var host = new WebHostBuilder() 
    .UseConfiguration(config) 
    .UseKestrel() 
    .UseContentRoot(Directory.GetCurrentDirectory()) 
    .UseIISIntegration() 
    .UseStartup<Startup>() 
    .Build(); 

host.Run(); 

W tym kawałku urządzenie ASP.NET wystąpienie wystąpienie Startup.cs klasy

.UseStartup<Startup>() 

Moje zapytanie jest jak mogę zdobyć (referencyjną) tego już instancja instancji obiektu startowego że mogę podłącz do mojej biblioteki/struktury.

Kontekst polega na skonfigurowaniu frameworka poziomu Uber i uzyskaniu odniesienia do tego skrzyżowania (Startup.cs), w którym wszystkie żądania są inicjowane.

Odpowiedz

10

Jeśli Startup narzędzia IStartup interfejs, coraz odniesienie do niej jest łatwy:

var host = new WebHostBuilder() 
.UseConfiguration(config) 
.UseKestrel() 
.UseContentRoot(Directory.GetCurrentDirectory()) 
.UseIISIntegration() 
.UseStartup<Startup>() 
.Build(); 

var startup = host.Services.GetService(typeof(IStartup)); // or from any other part of code using IServiceProvider. 

Jednak rdzeń asp.net nie wymagają swoją klasę startowy do wdrożenia tego interfejsu. Jeśli nie, użyje wzoru adaptera i dostosuje klasę Startup do interfejsu IStartup. Nadal będziesz mieć instancję IStartup, ale nie będzie to Twoja klasa Startup. Zamiast tego będzie to instancja o numerze ConventionBasedStartup. Rdzeń Asp.net zbada metody twojej klasy uruchamiania, znajdzie metody Configure i ConfigureServices i przekaże je do ConventionBasedStartup, które dostosują je do interfejsu IStartup. W takim przypadku nie można pobrać instancji klasy startowej bez ciężkiej refleksji, ponieważ nie jest ona przechowywana w żadnym polu (nawet prywatnym) pod numerem ConventionBasedStartup i jest dostępna tylko za pośrednictwem odwołań.

Krótka historia - jeśli chcesz uzyskać instancję klasy Startup - zmodyfikuj interfejs IStartup.

Aktualizacja informacji na temat wdrożenia interfejsu IStartup:

public class Startup : IStartup 
{ 
    public Startup(IHostingEnvironment env) 
    { 
     // constructor as usual 
     var builder = new ConfigurationBuilder() 
      .SetBasePath(env.ContentRootPath) 
      .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) 
      .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) 
      .AddEnvironmentVariables(); 
     Configuration = builder.Build(); 
    } 

    public IConfigurationRoot Configuration { get; } 

    public void Configure(IApplicationBuilder app) {    
     app.UseMvc(); 
     // resolve services from container 
     var env = (IHostingEnvironment) app.ApplicationServices.GetService(typeof(IHostingEnvironment)); 
     var logger = (ILoggerFactory)app.ApplicationServices.GetService(typeof(ILoggerFactory)); 
     logger.AddConsole(Configuration.GetSection("Logging")); 
     logger.AddDebug(); 
     // etc 
    }   

    public IServiceProvider ConfigureServices(IServiceCollection services) { 
     services.AddMvc(); 
     // etc 
     // return provider 
     return services.BuildServiceProvider(); 
    } 
} 
+0

Dzięki, to wydaje się obiecujące, Dodałem 'IStartup' jako interfejs do klasy' Startup', to podbiega do 'ConfigureServices' typ zwracany, Pytanie brzmi: co powinienem zwrócić w 'ConfigureServices', aby dopasować wymagania interfejsu' IStartup', jestem nowy w .net. – user2727195

+0

@ user2727195 zaktualizowano odpowiedź na przykładzie. – Evk

+0

Dzięki, kod visual studio narzeka na kilka zależności, na przykład 'ConfigurationBuilder' i' IConfigurationRoot'. Stworzyłem podstawową prostą aplikację webową z bare bare za pomocą generatora 'yo aspnet'. Chcesz najprostszą implementację na poziomie 'Startup.cs', ponieważ podnoszenie ciężarów będzie wykonywane w mojej strukturze. Również nie chcę podłączyć do 'mvc' z' asp.net mvc', ponieważ mam własną niestandardową implementację. Na bardzo najprostszym poziomie chcę, aby obiekt Startup właśnie "delegował" przychodzące żądania do mojego frameworka. – user2727195