2016-12-31 51 views
20

我有一個自託管的.NET Core Console應用程序Startup.cs在自託管的.NET Core Console應用程序中

該網頁顯示ASP.NET Core的示例,但我沒有網絡服務器。只需簡單的命令行應用程序。

是否有可能爲控制檯應用程序做這樣的事情?

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

我想用一個Startup.cs像在ASP.NET的核心,但在控制檯上。

這是怎麼回事?

+0

什麼是你想實現什麼?一個可以提供網頁的控制檯應用程序?是的,這將是一個「自包含的asp.net核心應用程序」,並且有幾個例子可用,例如http://druss.co/2016/08/deploy-and-run-net-core-application-without-installed-runtime-self-contained-applications/ –

+0

@ArashMotamedi我不想託管一個ASP.NET應用程序。我想有一個很好的舊控制檯應用程序來啓動我的類庫項目。我認爲我會免費獲得依賴注入等。 – Daniel

+0

明白了。但是,是的,你的方法有點倒退。請記住,所有.net核心應用程序都由獨立的庫組成,您可以自由地引用任何類型的項目的這些庫。事實上,一個Asp.net核心應用程序預先配置爲引用大量這些庫並公開一個http端點。但如果它是依賴注入,您需要爲您的控制檯應用程序,只需參考適當的庫。這裏有一個指導:http://andrewlock.net/using-dependency-injection-in-a-net-core-console-application/ –

回答

9

全部.NET Core應用程序由精心設計的獨立庫和包組成,您可以在任何類型的應用程序中自由引用和使用它們。恰巧,Asp.net core應用程序預先配置爲引用大量這些庫並公開了一個http端點。

但是,如果它是您的控制檯應用程序所需的依賴注入,只需引用相應的庫。這裏有一個指南:http://andrewlock.net/using-dependency-injection-in-a-net-core-console-application/

-3

是的。 ASP.NET Core應用程序可以自行託管(如您的示例),也可以託管在IIS等Web服務器中。在.NET Core中,所有應用程序都是控制檯應用

+0

在像我這樣的自我託管場景中。我怎樣才能連接Startup.cs? – Daniel

+0

你的意思是我會啓動一個網絡服務器來啓動我的控制檯應用程序? – Daniel

24

所以我用這個解決方案碰上了,被接受的答案啓發:

的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

這非常有幫助。它甚至適用於你的應用程序使用ASP.NET Core MVC(只要你的控制器精簡併且你的視圖沒有應用程序邏輯)。我必須做的另一件事是創建我自己的Microsoft.AspNetCore.Hosting.Internal.HostingEnvironment的子類MyHostingEnvironment並設置其ContentRootPath = Path.GetFullPath(「。」);然後在調用Program.cs中的新啓動之前執行IHostingEnvironment env = new MyHostingEnvironment(); services.AddSingleton ();然後將「新啓動()」更改爲「新啓動(env)」。 – Demerit

+0

優秀的答案!非常感謝您的分享。我只需要WebHost提供的一些東西,而這絕對是一種魅力。它應該是VS中的一個模板,說實話,這將是最有用的,因爲我只需要我的應用程序在沒有WebHosting的微型VPS Linux主機上運行。 – ppumkin

相關問題