Dependency injection F#Host.CreateDefaultBuilder().ConfigureServices()没有HostBuilderContext

Dependency injection F#Host.CreateDefaultBuilder().ConfigureServices()没有HostBuilderContext,dependency-injection,f#,.net-core-3.1,Dependency Injection,F#,.net Core 3.1,我正在创建WorkerService。 我有信心用C做这件事,但我在用F版本 C#Program.cs 公共静态IHostBuilder CreateHostBuilder(字符串[]args)=> Host.CreateDefaultBuilder(args) .ConfigureServices((主机上下文,服务)=> { //在这里,我可以访问构建的配置 //从配置中读取内容 var interval=TimeSpan.Parse(hostContext.Configurat

我正在创建WorkerService。
我有信心用C做这件事,但我在用F版本

C#Program.cs

公共静态IHostBuilder CreateHostBuilder(字符串[]args)=>
Host.CreateDefaultBuilder(args)
.ConfigureServices((主机上下文,服务)=>
{      
//在这里,我可以访问构建的配置
//从配置中读取内容
var interval=TimeSpan.Parse(hostContext.Configuration[“Service:Run:interval”]);
services.AddHostedService();
});
F#Program.fs

让CreateHostBuilder(args)=
Host.CreateDefaultBuilder()
.配置服务(
乐趣(服务:IServiceCollection)->//主机上下文:主机构建器上下文,
//乐趣(上下文:HostBuilderContext,服务:IServiceCollection)->
//构建的配置在哪里???
//让配置=???
services.AddHostedService()|>忽略
) 
我不知道如何读取配置来设置一些需要注入的服务设置

为什么IHostBuilder.ConfigureServices的签名不同?
C#
IHostBuilder配置服务(操作配置代理)

F#
IHostBuilder配置服务:configureDelegateAction->IHostBuilder

HostBuilderContext被传递给.ConfigureContainer(),因此我尝试了以下方法:


开放系统
开放系统。线程
开放系统.Threading.Tasks
类型IMyWorker=
抽象成员开始:单元->单元
键入MyWorker(间隔:TimeSpan)=
继承后台服务()
重写this.ExecuteAsync(步骤:CancellationToken):Task=Task.CompletedTask
将IMyWorker与
成员:this.Start()=()
让CreateHostBuilder(args)=
// 1. 这是空的
//让configuration=ConfigurationBuilder().Build()
//让interval=TimeSpan.Parse(配置。[“服务:运行:interval”])
让可变加载配置:选项=无
Host.CreateDefaultBuilder()
.ConfigureHostConfiguration(乐趣(confBuilder:IConfigurationBuilder)->
//这里可以阅读更多设置,比如“serilog.json”吗?
//2.这个还是空的
//let configuration=confBuilder.Build()
//让interval=TimeSpan.Parse(配置。[“服务:运行:interval”])
//在何处存储值?配置。[']
()
)
.ConfigureContainer(乐趣(hostContext:HostBuilderContext)->
//5.这没关系,它建得很好
//但是在ConfigureServices()之后调用ist
loadedConfiguration IConfigurationRoot
让interval=TimeSpan.Parse(hostContext.Configuration.[“服务:运行:interval”])
()
)
.配置服务(
乐趣(服务:IServiceCollection)->
//这是空的
//让configuration=ConfigurationBuilder().Build()
//让interval=TimeSpan.Parse(配置。[“服务:运行:interval”])
如果loadedConfiguration.IsNone,则会因“配置尚未加载”而失败
let interval=TimeSpan.Parse(loadedConfiguration.Value.[“服务:运行:间隔”])
//让interval=TimeSpan.Parse(“00:01:00”)
let worker=new MyWorker(间隔)
服务。AddSingleton(worker)|>忽略
)
但它不起作用,因为ConfigureContainer()是在ConfigureServices()之后调用的,我认为应该有一种方法可以使用构建的配置,而无需将其存储在某处


它应该如何工作

这应该可以做到:

let createHostBuilder args =
    Host
        .CreateDefaultBuilder(args)
        .ConfigureServices (fun hostContext services ->
            let interval = TimeSpan.Parse(hostContext.Configuration.["Service:Run:interval"]);
            services.AddHostedService<Worker>() |> ignore
        )
让createHostBuilder参数=
主办
.CreateDefaultBuilder(args)
.ConfigureServices(上下文服务->
让interval=TimeSpan.Parse(hostContext.Configuration.[“服务:运行:interval”]);
services.AddHostedService()|>忽略
)

这应该可以做到:

let createHostBuilder args =
    Host
        .CreateDefaultBuilder(args)
        .ConfigureServices (fun hostContext services ->
            let interval = TimeSpan.Parse(hostContext.Configuration.["Service:Run:interval"]);
            services.AddHostedService<Worker>() |> ignore
        )
让createHostBuilder参数=
主办
.CreateDefaultBuilder(args)
.ConfigureServices(上下文服务->
让interval=TimeSpan.Parse(hostContext.Configuration.[“服务:运行:interval”]);
services.AddHostedService()|>忽略
)

见鬼!最后我得到了它,我尝试了所有可能的语法,但总是以错误的顺序使用参数!谢谢如果要指定类型,该怎么办?我试过这些:1。乐趣(主机上下文:IConfigurationBuilder,服务:IServiceCollection)->2。fun(hostContext:IConfigurationBuilder)(services:IServiceCollection)->这两种语法都无效。您可以使用“fun(hostContext:HostBuilderContext)(services:IServiceCollection)->…”来指定类型!最后我得到了它,我尝试了所有可能的语法,但总是以错误的顺序使用参数!谢谢如果要指定类型,该怎么办?我试过这些:1。乐趣(主机上下文:IConfigurationBuilder,服务:IServiceCollection)->2。fun(hostContext:IConfigurationBuilder)(服务:IServiceCollection)->这两种语法都无效。您可以使用“fun(hostContext:HostBuilderContext)(服务:IServiceCollection)->…”指定类型