web-dev-qa-db-ja.com

自己ホスト型.NET Core ConsoleアプリケーションのStartup.cs

自己ホスト。NET Core Console Applicationがあります。

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

コンソールアプリケーションに対してこのようなことをすることは可能ですか?

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を使用したいと思います。

これはどう?

40
Daniel

すべての.NET Coreアプリケーションは、適切に作成された独立したライブラリとパッケージで構成されており、任意のタイプのアプリケーションで自由に参照および使用できます。 Asp.net coreアプリケーションは、これらのライブラリの多くを参照するように事前構成されており、httpエンドポイントを公開することがあります。

ただし、コンソールアプリに必要なDependency Injectionの場合は、適切なライブラリを参照するだけです。ここにガイドがあります: http://andrewlock.net/using-dependency-injection-in-a-net-core-console-application/

21
Arash Motamedi

だから、私は受け入れられた答えに触発されたこのソリューションに出会いました:

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

別の方法は、Microsoft.Extensions.HostingパッケージのHostBuilderを使用することです。

public static async Task Main(string[] args)
{
    var builder = new HostBuilder()
        .ConfigureAppConfiguration((hostingContext, config) =>
        {
            config.SetBasePath(Directory.GetCurrentDirectory());
            config.AddJsonFile("appsettings.json", true);
            if (args != null) config.AddCommandLine(args);
        })
        .ConfigureServices((hostingContext, services) =>
        {
            services.AddHostedService<MyHostedService>();
        })
        .ConfigureLogging((hostingContext, logging) =>
        {
            logging.AddConfiguration(hostingContext.Configuration);
            logging.AddConsole();
        });

    await builder.RunConsoleAsync();
}
4
Raj