.net core IHostBuilder.ConfigureServices引导中的简单注入器日志工厂
我将SimpleInjector与通用主机nuget包一起使用,除了注册顺序出现问题外,一切都很好 我有一个builder类,它返回两个接口,.net core IHostBuilder.ConfigureServices引导中的简单注入器日志工厂,.net-core,simple-injector,.net Core,Simple Injector,我将SimpleInjector与通用主机nuget包一起使用,除了注册顺序出现问题外,一切都很好 我有一个builder类,它返回两个接口,IMessagePublisher和IMessageSubscriber,这个builder类还需要一个ILoggerFactory 我无法使用iLogger工厂,因为它尚未配置,并且无法调用容器.GetInstance,因为调用代码时容器仍在使用注册进行引导 我的主要主持人在这里: var host=CreateHostBuilder(args) .us
IMessagePublisher
和IMessageSubscriber
,这个builder类还需要一个ILoggerFactory
我无法使用iLogger工厂
,因为它尚未配置,并且无法调用容器.GetInstance
,因为调用代码时容器仍在使用注册进行引导
我的主要主持人在这里:
var host=CreateHostBuilder(args)
.useserlog((主机上下文,日志配置)=>
{
var setting=hostContext.Configuration
.GetSection(Settings.Name).GetAndAssert();
if(setting.IsDebug==true)
loggerConfiguration.MinimumLevel.Debug();
其他的
loggerConfiguration.MinimumLevel.Information();
记录器配置
.MinimumLevel.Override(“Microsoft”,LogEventLevel.Warning)
.Enrich.FromLogContext()的
.WriteTo.Console()
.WriteTo.File(“logging.log”);
})
.Build()
.使用SimpleInjector(容器);
下面是我的CreateHostBuilder(我的问题在builder.Create
方法中):
公共静态IHostBuilder CreateHostBuilder(字符串[]args)
{
返回主机
.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((主机上下文,生成器)=>
{
if(hostContext.HostingEnvironment.IsDevelopment())
{
builder.AddUserSecrets();
}
})
.ConfigureServices((主机上下文,服务)=>
{
services.AddSimpleInjector(容器,选项=>
{
options.AddHostedService();
options.AddLogging();
var mqttSettings=hostContext
配置
.GetSection(MqttSettings.Name)
.GetAndAssert();
var builder=新的MqttMessageBusBuilder(mqttSettings);
建设者。创建(
新建[]{new MessagePackSerializer()},
新标识使用TransportHeaders(),
/*下面是不允许的*/
container.GetInstance,
//如果尚未配置,我也不知道从何处获取iLogger工厂
我们的出版商,
我们的订户,
mqttSettings.isDebug);
container.RegisterInstance(messagePublisher);
容器.RegisterInstance(messageSubscriber);
});
});
}
我无法使用单例并将实例化延迟到需要时,因为我需要生成器返回IMessagePublisher
和IMessageSubscriber
实例
否则,我会使用以下命令,其中container.GetInstance()
有效:
//注册工厂以创建PolygonWebsocket
container.RegisterSingleton(()=>{
var settings=container.GetInstance();
var secrets=container.GetInstance();
返回新的PolygonWebsocket(
秘密,一夫多妻制,
settings.PolygonWebSocketUrl,
settings.PolygonReconnectTimeout,
container.GetInstance()
});
如何在
CreateHostBuilder
bootstrap期间将iLogger工厂注入我的MqttMessageBusBuilder.Create
方法?这个问题与简单的注入器无关,因为iLogger工厂
来自IServiceCollection
及其最终的IServiceProvider
,这是鸡和蛋的两难选择。您希望将iLogger工厂
提供给MqttMessageBusBuilder。在ConfigureServices
期间创建
,而iLogger工厂
只有在其可用时才能从IServiceProvider
解决,这处于后期阶段
据我所知,你可以做三件事:
IServiceCollection
中拉入iLogger工厂
,因为此时的注册已存在于IServiceCollection
中ConfigureServices
之后(即在Configure
内部)将消息接口的注册推迟到untal之后.ConfigureServices((主机上下文,服务)=>
{
变量工厂=(iLogger工厂)服务
.Last(s=>s.ServiceType==typeof(iLogger工厂))
.实施实例;
services.AddSimpleInjector(容器,选项=>
{
...
var builder=新的MqttMessageBusBuilder(mqttSettings);
建设者。创建(
新建[]{new MessagePackSerializer()},
新标识使用TransportHeaders(),
工厂,
我们的出版商,
我们的订户,
mqttSettings.isDebug);
container.RegisterInstance(messagePublisher);
容器.RegisterInstance(messageSubscriber);
});
});
示例2:
var主机=
CreateHostBuilder(args)
.useserlog((主机上下文,日志配置)=>
{
...
})
.Build()
.使用SimpleInjector(容器);
var factory=host.Services.GetRequiredInstance();
var mqttSettings=hostContext
配置
.GetSection(MqttSettings.Name)
.GetAndAssert();
var builder=新的MqttMessageBusBuilder(mqttSettings);
建设者。创建(
新建[]{new MessagePackSerializer()},
新标识使用TransportHeaders(),
工厂,
我们的出版商,