Wire and inject NLog into .NET Core console app

前端 未结 3 1427
北恋
北恋 2021-01-11 09:13

I created a consumer/job that I will have running as a process on Linux written in C#.

The process will:

  1. Read a message from RabbitMQ
  2. Make chang
3条回答
  •  感动是毒
    2021-01-11 10:19

    In DotNet Core 2 you can use the start up class now and clean up the code a bit to look more like the web one.

    And as a bonus a way to start your app inside the DI container using ConsoleApp

    Program.cs

    static void Main(string[] args)
    {
        IServiceCollection services = new ServiceCollection();
    
        Startup startup = new Startup();
        startup.ConfigureServices(services);
    
        IServiceProvider serviceProvider = services.BuildServiceProvider();
    
        // entry to run app
        serviceProvider.GetService().Run();
    }
    

    Startup.cs

    public class Startup
    {
        IConfigurationRoot Configuration { get; }
    
        public Startup()
        {
            var builder = new ConfigurationBuilder()
              .SetBasePath(Directory.GetCurrentDirectory())
              .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
    
            Configuration = builder.Build();
        }
    
    
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddSingleton(Configuration);
    
            services.AddSingleton();
    
            services.AddLogging(loggingBuilder => {
               loggingBuilder.AddNLog("nlog.config");
            });
    
            services.AddTransient();
        }
    }
    

    ConsoleApp.cs

    public class ConsoleApp
    {
        private readonly ILogger _logger;
        private readonly IMyConfiguration _config;
    
        public ConsoleApp(IMyConfiguration configurationRoot, ILogger logger)
        {
            _logger = logger;
            _config = configurationRoot;
        }
    
    
        public void Run()
        {
            var test = _config.YourItem;
    
            _logger.LogCritical(test);
    
            System.Console.ReadKey();
        }
    }
    

    Configuration.cs

    public class MyConfiguration : IMyConfiguration
    {
    
        IConfigurationRoot _configurationRoot;
        public MyConfiguration(IConfigurationRoot configurationRoot)
        {
            _configurationRoot = configurationRoot;
        }
    
        public string YourItem => _configurationRoot["YourItem"];
    }
    
    
    public interface IMyConfiguration
    {
        string YourItem { get; }
    }
    

提交回复
热议问题