Dependency injection F#Host.CreateDefaultBuilder().ConfigureServices()没有HostBuilderContext
我正在创建WorkerService。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
我有信心用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)->…”指定类型