2016-12-31 5 views
20

私は自己ホスト.NETコアコンソールアプリケーションを持っています。自己ホスト型.NETコアコンソールアプリケーションのStartup.cs

ウェブではの例を示しています。ASP.NETコアですが、ウェブサーバーはありません。単なるコマンドラインアプリケーションです。

コンソールアプリケーションでこれを行うことはできますか?

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

ASP.NET CoreのようなStartup.csをコンソールで使用したいと思います。

これはどのようにですか?

+0

あなたが達成するために何をしようとしていますか? Webページを提供できるコンソールアプリケーションですか?はい、それは "自己完結型asp.netコアアプリケーション"であり、利用可能ないくつかの例があります。 http://druss.co/2016/08/deploy-and-run-net-core-application-without-installed-runtime-self-contained-applications/ –

+0

@ArashMotamedi私はASP.NETアプリケーションをホストしたくありません。私はクラスライブラリプロジェクトを開始する良い古いコンソールアプリケーションを持っていたい。私は、私がDependency Injectionなどを無料で入手できると思った。 – Daniel

+0

入手しました。しかし、はい、あなたのアプローチは少し後ろです。すべての.netコアアプリケーションは独立したライブラリで構成されているので、任意のプロジェクトタイプのライブラリを自由に参照することができます。 Asp.netのコアアプリケーションは、多くのライブラリを参照するようにあらかじめ設定されており、httpエンドポイントを公開しています。しかし、あなたがあなたのコンソールアプリケーションに必要なDependency Injectionなら、適切なライブラリを参照するだけです。ここにガイドがあります:http://andrewlock.net/using-dependency-injection-in-a-net-core-console-application/ –

答えて

9

すべて.NET Coreすべてのアプリケーションは、自由に作成された独立したライブラリとパッケージで構成されており、どのアプリケーションでも参照して使用できます。 Asp.net coreアプリケーションはあらかじめ用意されており、多くのライブラリを参照するようになっており、httpエンドポイントを公開しています。

しかし、Dependency Injectionの場合、コンソールアプリケーションに必要な場合は、適切なライブラリを参照するだけです。だから私は、このソリューションで出くわしたhttp://andrewlock.net/using-dependency-injection-in-a-net-core-console-application/

-3

はい、そうです。 ASP.NETコアアプリケーションは、自分の例のように自己ホストすることも、IISなどのWebサーバーの内部にホストすることもできます。 .NET Coreでは、すべてのアプリケーションがコンソールアプリケーションです。

+0

Startup.csに接続するにはどうしたらいいですか? – Daniel

+0

あなたは私のコンソールアプリケーションを起動するだけのWebサーバーを起動させるでしょうか? – 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を使用している(コントローラがリーンで、ビューにアプリケーションロジックがない場合)。 MyHostingEnvironmentという名前のMicrosoft.AspNetCore.Hosting.Internal.HostingEnvironmentの独自のサブクラスを作成し、そのContentRootPath = Path.GetFullPath( "。");を設定しました。次に、Program.csで新しいスタートアップを呼び出す前にIHostingEnvironment env = new MyHostingEnvironment();を実行します。 services.AddSingleton (); 「新しいスタートアップ()」を「新しいスタートアップ(env)」に変更します。 – Demerit

+0

優秀な回答!共有いただきありがとうございます。私はちょうどWebHostが提供するもののいくつかを必要とし、これは確かに魅力のように動作します。それは正直言ってVSのテンプレートでなければならない、私はちょうどWebHostingせずに小型のVPS Linuxホスト上で実行するために私のアプリが必要なので、最も役立つだろう。 – ppumkin

関連する問題