2016-12-31 3 views
20

Ich habe eine selbst gehostete .NET Core Console-Anwendung. Das Netz zeigt Beispiele für ASP.NET Core aber ich habe keinen Webserver. Nur eine einfache Befehlszeilenanwendung.Startup.cs in einer selbst gehosteten .NET Core Console-Anwendung

Ist es möglich, so etwas für Konsolenanwendungen zu tun?

public static void Main(string[] args) 
{ 
    // I don't want a WebHostBuilder. Just a command line 

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

    host.Run(); 
} 

Ich möchte ein Startup.cs wie in ASP.NET Core aber auf der Konsole verwenden.

Wie geht das?

+0

Was Sie versuchen zu erreichen? Eine Konsolenanwendung, die Webseiten bereitstellen kann? Ja, das wäre eine "eigenständige asp.net-Kernanwendung" und es sind einige Beispiele verfügbar, z. http://druss.co/2016/08/deploy-and-run-net-core-application-without-installed-runtime-self-contained-applications/ –

+0

@ArashMotamedi Ich möchte keine ASP.NET-Anwendung hosten . Ich möchte eine gute alte Konsolenanwendung haben, die mein Klassenbibliotheksprojekt startet. Ich dachte, ich würde Dependency Injection usw. kostenlos bekommen. – Daniel

+0

Bekam es. Aber ja, dein Ansatz ist ein bisschen rückwärts. Denken Sie daran, dass alle .net-Kernanwendungen aus unabhängigen Bibliotheken bestehen und es Ihnen sicherlich freisteht, diese Bibliotheken für jede Art von Projekt zu referenzieren. Es kommt einfach vor, dass eine Asp.net-Kernanwendung vorkonfiguriert ist, um viele dieser Bibliotheken zu referenzieren und einen http-Endpunkt verfügbar zu machen. Aber wenn Dependency Injection für Ihre Konsolen-App benötigt wird, verweisen Sie einfach auf die entsprechende Bibliothek. Hier ist ein Leitfaden: http://andrewlock.net/using-dependency-injection-in-a-net-core-console-application/ –

Antwort

9

Alle .NET Core Anwendungen bestehen aus gut gestalteten unabhängigen Bibliotheken und Paketen, auf die Sie in jeder Art von Anwendung verweisen können. Es kommt einfach vor, dass eine Asp.net core Anwendung vorkonfiguriert ist, um viele dieser Bibliotheken zu referenzieren und einen HTTP-Endpunkt verfügbar macht.

Aber wenn Dependency Injection Sie für Ihre Konsole App benötigen, verweisen Sie einfach auf die entsprechende Bibliothek. Hier ist eine Anleitung: http://andrewlock.net/using-dependency-injection-in-a-net-core-console-application/

-3

Ja, ist es. ASP.NET Core-Anwendungen können entweder - wie in Ihrem Beispiel - selbst gehostet oder auf einem Webserver wie IIS gehostet werden. In .NET Core sind alle Anwendungen Konsolenanwendungen.

+0

in einem selbst gehosteten Szenario wie meiner. Wie kann ich ein Startup.cs anschließen? – Daniel

+0

Sie meinen, ich würde einen Web-Server starten, nur um meine Konsolenanwendung zu starten? – Daniel

24

So stieß ich auf mit dieser Lösung durch die akzeptierte Antwort inspiriert:

Program.cs

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     IServiceCollection services = new ServiceCollection(); 
     // Startup.cs finally :) 
     Startup startup = new Startup(); 
     startup.ConfigureServices(services); 
     IServiceProvider serviceProvider = services.BuildServiceProvider(); 

     //configure console logging 
     serviceProvider 
      .GetService<ILoggerFactory>() 
      .AddConsole(LogLevel.Debug); 

     var logger = serviceProvider.GetService<ILoggerFactory>() 
      .CreateLogger<Program>(); 

     logger.LogDebug("Logger is working!"); 

     // Get Service and call method 
     var service = serviceProvider.GetService<IMyService>(); 
     service.MyServiceMethod(); 
    } 
} 

Startup.cs

public class Startup 
{ 
    IConfigurationRoot Configuration { get; } 

    public Startup() 
    { 
     var builder = new ConfigurationBuilder() 
      .AddJsonFile("appsettings.json"); 

     Configuration = builder.Build(); 
    } 

    public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddLogging(); 
     services.AddSingleton<IConfigurationRoot>(Configuration); 
     services.AddSingleton<IMyService, MyService>(); 
    } 
} 

appsettings.json

{ 
    "SomeConfigItem": { 
     "Token": "8201342s223u2uj328", 
     "BaseUrl": "http://localhost:5000" 
    } 
} 

MyService.cs

public class MyService : IMyService 
{ 
    private readonly string _baseUrl; 
    private readonly string _token; 
    private readonly ILogger<MyService> _logger; 

    public MyService(ILoggerFactory loggerFactory, IConfigurationRoot config) 
    { 
     var baseUrl = config["SomeConfigItem:BaseUrl"]; 
     var token = config["SomeConfigItem:Token"]; 

     _baseUrl = baseUrl; 
     _token = token; 
     _logger = loggerFactory.CreateLogger<MyService>(); 
    } 

    public async Task MyServiceMethod() 
    { 
     _logger.LogDebug(_baseUrl); 
     _logger.LogDebug(_token); 
    } 
} 

IMyService.cs

public interface IMyService 
{ 
    Task MyServiceMethod(); 
} 
+1

Das war sehr hilfreich. Es funktioniert sogar, wenn Ihre Anwendung ASP.NET Core MVC verwendet (solange Ihre Controller schlank sind und Ihre Ansichten keine Anwendungslogik enthalten). Die einzige zusätzliche Sache, die ich tun musste, war, meine eigene Unterklasse von Microsoft.AspNetCore.Hosting.Internal.HostingEnvironment namens MyHostingEnvironment zu erstellen und deren ContentRootPath = Path.GetFullPath ("."); und dann vor dem Aufruf des neuen Startup in Program.cs IHostingEnvironment env = new MyHostingEnvironment(); services.AddSingleton (); und ändern Sie dann "new Startup()" zu "new Startup (env)". – Demerit

+0

Ausgezeichnete Antwort! Vielen Dank für das Teilen. Ich brauchte nur einige der Dinge, die der WebHost bietet und das funktioniert definitiv wie ein Zauber. Es sollte eine Vorlage in VS sein, um ehrlich zu sein, es wäre sehr hilfreich, weil ich meine App nur auf einem VPS Linux Host ohne WebHosting ausführen muss. – ppumkin

Verwandte Themen