首页 文章

自托管.NET Core控制台应用程序中的Startup.cs

提问于
浏览
30

我有一个自我托管的 .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,但是在控制台上 .

怎么样?

4 回答

  • 39

    所有 .NET Core 应用程序都由精心设计的独立库和包组成,您可以在任何类型的应用程序中自由引用和使用它们 . 事实上,一个 Asp.net core 应用程序预先配置为引用许多这些库并公开一个http endpoints .

    但是,如果它是指南:http://andrewlock.net/using-dependency-injection-in-a-net-core-console-application/

  • 0

    所以我遇到了这个解决方案,受到了接受的答案的启发:

    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

    另一种方法是使用 HostBuilder 来自 Microsoft.Extensions.Hosting 包 .

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

    是的 . ASP.NET核心应用程序既可以自我托管 - 如在您的示例中 - 也可以托管在Web服务器(如IIS)中 . 在.NET Core中,所有应用都是控制台应用 .

相关问题