2015-05-15 5 views
16

Ist es für eine ASP.NET 5-beta4-Konsolenanwendung (erstellt aus der ASP.NET Console-Projektvorlage in VS2015) möglich, die Klasse Startup zum Registrieren von Diensten und Einrichten zu verwenden Konfigurationsdetails?Verwenden der Startup-Klasse in der ASP.NET5-Konsolenanwendung

Ich habe eine typische Startup Klasse erstellen versucht, aber es scheint nie aufgerufen werden, wenn die Konsolenanwendung über dnx . run oder in Visual Studio 2015

Startup.cs ist ziemlich viel laufen:

public class Startup 
{ 
    public Startup(IHostingEnvironment env) 
    { 
    Configuration configuration = new Configuration(); 
    configuration.AddJsonFile("config.json"); 
    configuration.AddJsonFile("config.{env.EnvironmentName.ToLower()}.json", optional: true); 
    configuration.AddEnvironmentVariables(); 

    this.Configuration = configuration; 
    } 

    public void ConfigureServices(IServiceCollection services) 
    { 
    services.Configure<Settings>(Configuration.GetSubKey("Settings")); 

    services.AddEntityFramework() 
      .AddSqlServer() 
      .AddDbContext<ApplicationContext>(options => options.UseSqlServer(this.Configuration["Data:DefaultConnection:ConnectionString"])); 
    } 

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
    loggerFactory.AddConsole(minLevel: LogLevel.Warning); 
    } 
} 

Ich habe versucht, die Startup Klasse in meiner Main Methode manuell zu erstellen, aber das scheint nicht die richtige Lösung und hat mir bisher nicht erlaubt, die Dienste zu konfigurieren.

Ich nehme an, es gibt eine Möglichkeit für mich, eine HostingContext zu erstellen, die einen Webserver nicht startet, aber die Konsolenanwendung am Leben erhält. Etwas entlang der Linien von:

HostingContext context = new HostingContext() 
{ 
    ApplicationName = "AppName" 
}; 

using (new HostingEngine().Start(context)) 
{ 
    // console code 
} 

jedoch bisher die einzige Art, wie ich dies an die Arbeit bekommen kann, ist, wenn ich die HostingContext.ServerFactoryLocation-Microsoft.AspNet.Server.WebListener gesetzt, die den Web-Server startet.

+0

Gibt es so etwas wie eine ASP.NET 5 Console Application? Sicher ist es entweder eine ASP.NET Core Application oder eine .NET Core Console Application? – series0ne

Antwort

17

Was Sie suchen, ist die richtige Idee, aber ich denke, Sie müssen einen Moment sichern.

Erstens haben Sie vielleicht bemerkt, dass Ihre Standardklasse Program keine statischen Methoden mehr verwendet; Das liegt daran, dass der Konstruktor tatsächlich eine Abhängigkeitsinjektionsliebe von sich selbst erhält!

public class Program 
{ 
    public Program(IApplicationEnvironment env) 
    {    
    }   

    public void Main(string[] args) 
    { 
    } 
} 

Leider sind nicht so viele Dienste von einer registrierten ASP.NET 5-Hosting-Umgebung bekannt. dank this article und die IServiceManifest Sie können sehen, dass nur wenige Dienste zur Verfügung gibt es:

Microsoft.Framework.Runtime.IAssemblyLoaderContainer Microsoft.Framework.Runtime.IAssemblyLoadContextAccessor Microsoft.Framework.Runtime.IApplicationEnvironment Microsoft.Framework .Runtime.IFileMonitor Microsoft.Framework.Runtime.IFileWatcher Microsoft.Framework.Runtime.ILibraryManager Microsoft.Framework.Runtime.ICompilerOptionsProvider Microsoft.Framework.Runtime.IApplicationShutdown

Dies bedeutet, dass Sie auch die Freude haben, einen eigenen Service Provider zu erstellen, da wir den vom Framework bereitgestellten nicht bekommen können.

private readonly IServiceProvider serviceProvider; 

public Program(IApplicationEnvironment env, IServiceManifest serviceManifest) 
{ 
    var services = new ServiceCollection(); 
    ConfigureServices(services); 
    serviceProvider = services.BuildServiceProvider(); 
} 

private void ConfigureServices(IServiceCollection services) 
{ 
} 

Dies nimmt viel von der Magie entfernt, die Sie in den Standard ASP.NET 5 Projekte zu sehen, und jetzt haben Sie den Service-Provider Sie in Ihrem Main für Sie wollten.

Es gibt noch ein paar „Fallstricke“ in hier, so könnte ich sie auch auflisten:

  • Wenn Sie nach einem IHostingEnvironment fragen, wird es null sein. Das liegt daran, dass eine Hosting-Umgebung von ASP.Net 5 Hosting stammt.
  • Da Sie keinen von denen haben, werden Sie ohne Ihre IHostingEnvironment.EnvironmentName bleiben - Sie müssen es von den Umgebungsvariablen selbst sammeln. Was, weil Sie es bereits in Ihr Konfigurationsobjekt laden, sollte kein Problem sein. (Sein Name ist "ASPNET_ENV", den Sie auf der Registerkarte Debug Ihrer Projekteinstellungen hinzufügen können; dies ist für Konsolenanwendungen nicht standardmäßig festgelegt. Sie werden das sowieso umbenennen wollen, da Sie es nicht wirklich sind Sprechen Sie über eine ASPNET-Umgebung mehr.)
+0

Danke, das hilft, sobald der 'ServiceProvider' erstellt wurde, wie Sie bereits erwähnt haben, kann ich ihn in den' DbContext' übergeben. Ist es sicher, den 'ServiceProvider' statisch zu machen? Ich gehe davon aus, dass es keine Möglichkeit gibt, wie in ASP.NET5-Hosting-Projekten automatisch angehängt zu werden. – sixones

+1

Sobald Sie Ihren 'IServiceProvider' verwenden, um etwas zu erstellen, kann er eine Instanz des' IServiceProvider' über DI erhalten und sich selbst verbreiten. Es wird allgemein als schlechte Praxis angesehen, einen Singleton-Dienstanbieter zu haben; es bricht Testbarkeit, für Starts. –

+0

Ich habe den 'ServiceProvider' verwendet, um einen 'DbContext' zu erzeugen, wenn ich den Kontext mit dem Provider erstelle, aber wenn ich einen zweiten' DbContext' erzeuge, ohne den Provider zu übergeben, scheitert es. Muss ich den 'ServiceProvider' manuell registrieren, damit er automatisch erreichbar ist? – sixones

Verwandte Themen