.net core IHostBuilder.ConfigureServices引导中的简单注入器日志工厂

.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

我将SimpleInjector与通用主机nuget包一起使用,除了注册顺序出现问题外,一切都很好

我有一个builder类,它返回两个接口,
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之后
  • 现在进行注册,但使用延迟初始化,以便在解析消息接口时生成
  • 示例1:

    .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(),
    工厂,
    我们的出版商,