具有 IOC 和 Serilogging 的 .NET Core 5 控制台应用程序没有微服务?

.NET Core 5 console app with IOC and Serilogging without microservice?

我需要创建一个使用 IOC(Autofac)、ILogging(Serilog) 和消息队列 (MQRabbit) 的简单 .NET Core 5 控制台应用程序。我之前在 运行 微服务的控制台应用程序中做过这个(Microsoft IOC 除外,而不是 Autofac),但是这次我只需要一个基本的控制台应用程序而不托管服务。这是怎么做到的?

我的微服务中有这段代码:

public static void Main(string[] args) {
    Log.Logger = new LoggerConfiguration().DefaultLoggerSetup<Program>();
    var serviceName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;

    var configurationBuilder = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
    var appSettings = configurationBuilder.Get<AppSettings>();

    Log.Information("{@serviceName} microservice starting up.", serviceName);
    Host.CreateDefaultBuilder(args)
        .UseMQ(context => context.UseSettings(appSettings.MQSettings))
        .UseSerilog((hostingContext, loggerConfiguration) => loggerConfiguration.ReadFrom.Configuration(hostingContext.Configuration))
        .ConfigureServices((hostContext, services) =>
        {
            services
                .AddHostedService<MyService>()
                .Configure<MQSettings>(configurationBuilder.GetSection("MQSettings"))
                .AddTransient<IController, Controller>()
                ...
        })
        .Build().Run();
    Log.Information("{@serviceName} microservice closing down.", serviceName);
}

但在这种情况下我不需要托管任何东西,它应该只是一个基本的控制台应用程序,带有日志记录、注入和一些 I/O 在 MQ 上。

编辑:

这是我设法得到的:

    public class Program
    {
        static void Main(string[] args)
        {
            var serviceName = System.Reflection.Assembly.GetExecutingAssembly().GetName().Name;
    
            var configurationBuilder = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
            var appSettings = configurationBuilder.Get<AppSettings>();
            CompositionRoot(configurationBuilder).Resolve<ITestController>().PlaceTrestment1OnMQTest();
        }
        private static IContainer CompositionRoot(IConfigurationRoot configurationRoot)
        {
            var serilog = new LoggerConfiguration().ReadFrom.Configuration(configurationRoot).CreateLogger();
            var loggerFactory = new LoggerFactory().AddSerilog(serilog);
            Microsoft.Extensions.Logging.ILogger logger = loggerFactory.CreateLogger("Logger");
    
            var builder = new ContainerBuilder();
            builder.Register<Microsoft.Extensions.Logging.ILogger>((c, p) =>
            { return logger; });
            //builder.Register<Microsoft.Extensions.Logging.ILogger>((c, p) =>
            //{ return new LoggerConfiguration().ReadFrom.Configuration(configurationRoot).CreateLogger(); });
            builder.RegisterType<TestController>().As<ITestController>();
            return builder.Build();
        }
    }
}
public class TestController : ITestController
{
    private ILogger<TestController> _logger;

    public TestController(ILogger<TestController> logger)
    {
        _logger = logger;
    }
    public void PlaceTrestment1OnMQTest()
    {
        
    }
}

我在 运行 处理它时遇到异常 :

Cannot resolve parameter 'Microsoft.Extensions.Logging.ILogger1[ConnectorMockTest.BusinessLogicLayer.TestController] logger' of constructor 'Void .ctor(Microsoft.Extensions.Logging.ILogger1[ConnectorMockTest.BusinessLogicLayer.TestController])'.

注册非泛型 ILogger 不会自动注册泛型 ILogger<T> 而这正是您想要做的。

ILogger 注入 TestController 构造函数而不是 ILogger 并且假设其余代码有效,它应该可以正常工作。

我的印象是服务主机主要用于托管 webservice/webpage 或类似的情况。然而,在“封闭的”控制台应用程序中创建服务并没有错,该应用程序通过依赖注入、配置和启动例程为应用程序提供服务。即使应用只是一炮而红的应用。