具有 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.ILogger
1[ConnectorMockTest.BusinessLogicLayer.TestController])'.
注册非泛型 ILogger
不会自动注册泛型 ILogger<T>
而这正是您想要做的。
将 ILogger
注入 TestController
构造函数而不是 ILogger 并且假设其余代码有效,它应该可以正常工作。
我的印象是服务主机主要用于托管 webservice/webpage 或类似的情况。然而,在“封闭的”控制台应用程序中创建服务并没有错,该应用程序通过依赖注入、配置和启动例程为应用程序提供服务。即使应用只是一炮而红的应用。
我需要创建一个使用 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.ILogger
1[ConnectorMockTest.BusinessLogicLayer.TestController] logger' of constructor 'Void .ctor(Microsoft.Extensions.Logging.ILogger
1[ConnectorMockTest.BusinessLogicLayer.TestController])'.
注册非泛型 ILogger
不会自动注册泛型 ILogger<T>
而这正是您想要做的。
将 ILogger
注入 TestController
构造函数而不是 ILogger 并且假设其余代码有效,它应该可以正常工作。
我的印象是服务主机主要用于托管 webservice/webpage 或类似的情况。然而,在“封闭的”控制台应用程序中创建服务并没有错,该应用程序通过依赖注入、配置和启动例程为应用程序提供服务。即使应用只是一炮而红的应用。