Startup.cs в самостоятельном приложении .NET Core Console

У меня есть самостоятельное приложение .NET Core Console Application.

В Интернете показаны примеры для 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 Core, но на консоли.

Как это сделать?

Ответы

Ответ 1

Все приложения .NET Core состоят из хорошо продуманных независимых библиотек и пакетов, которые вы можете ссылаться и использовать в любом типе приложений. Так получилось, что приложение Asp.net core поставляется предварительно сконфигурировано для ссылки на многие из этих библиотек и предоставляет конечную точку http.

Но если вам нужно приложение Infusion Injection для консольного приложения, просто обратитесь к соответствующей библиотеке. Вот руководство: http://andrewlock.net/using-dependency-injection-in-a-net-core-console-application/

Ответ 2

Итак, я столкнулся с этим решением, вдохновленным принятым ответом:

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

Ответ 3

Да, это так. Основные приложения ASP.NET могут быть либо самомодными - как в вашем примере, либо размещаться внутри веб-сервера, например IIS. В .NET Core все приложения - консольные приложения.