为什么 Giraffe/AspNetCore + SignalR 依赖项注入无法解析 MailboxProcessor 单例?
Why does Giraffe/AspNetCore + SignalR dependency injection fail to resolve a MailboxProcessor singleton?
我正在设置一个简单的 Giraffe 应用程序,其中包含一个或两个端点和一个 SignalR 集线器。我的是这样的:
type JsonBlob = JsonProvider<"Blob.json">
type Message =
| GetBlobs of AsyncReplyChannel<JsonBlob.Root list>
| PostBlob of JsonBlob.Root
type JsonBlobHub(agent : MailboxProcessor<Message>) =
inherit Hub()
member self.RespondToClient() =
let blobs = agent.PostAndReply(GetBlobs)
self.Clients.All.SendAsync("ReceiveBlobList", blobs)
let agentFactory(serviceProvider : IServiceProvider) =
let thing = serviceProvider.GetService<Thing>()
MailboxProcessor.Start(fun (inbox : MailboxProcessor<Message>) ->
/* loop implementation */
)
// other stuff
let configureApp (app : IApplicationBuilder) =
app.UseSignalR(fun routes -> routes.MapHub<JsonBlobHub>(PathString "/blobhub")) |> ignore
app.UseGiraffe webApp // webApp defined elsewhere, not important
let configureServices (services : IServiceCollection) =
services.AddSingleton<MailboxProcessor<Message>>(agentFactory) |> ignore
services.AddGiraffe() |> ignore
services.AddSignalR() |> ignore
let main argv =
WebHostBuilder() =
.UseKestrel()
.UseWebRoot("WebRoot")
.Configure(Action<IApplicationBuilder> configureApp)
.ConfigureServices(configureServices)
.ConfigureLogging(configureLogging)
.Build()
.Run
0
当 SignalR 客户端连接到 /blobhub
时,连接意外关闭,因为应用程序在尝试激活 BlobHub
class 时无法解析 MailboxProcessor<Message>
。
不过,我有点难过,因为我已经在 configureServices
函数中明确地在容器中注册了 MailboxProcessor<Message>
类型。有人看到这段代码有问题吗?或者也许我假设这些东西应该起作用,但有一些我不知道的它们不应该起作用的原因?
嗯....原来是我干了件蠢事,一不小心就有了两个Message
的定义。我的 JsonBlobHub
使用的是一种定义,而 agentFactory
和 configureServices
使用的是另一种定义。一旦我删除了 Message
的定义之一,DI 容器就会像您期望的那样解析 JsonBlobHub
的激活。
我会说这最终是浪费时间,但它确实导致了一个很好的独立示例,它结合使用 F#、Giraffe、ASP.NET Core 和 SignalR,并进行了演示所有的部分都能很好地结合在一起。
我正在设置一个简单的 Giraffe 应用程序,其中包含一个或两个端点和一个 SignalR 集线器。我的是这样的:
type JsonBlob = JsonProvider<"Blob.json">
type Message =
| GetBlobs of AsyncReplyChannel<JsonBlob.Root list>
| PostBlob of JsonBlob.Root
type JsonBlobHub(agent : MailboxProcessor<Message>) =
inherit Hub()
member self.RespondToClient() =
let blobs = agent.PostAndReply(GetBlobs)
self.Clients.All.SendAsync("ReceiveBlobList", blobs)
let agentFactory(serviceProvider : IServiceProvider) =
let thing = serviceProvider.GetService<Thing>()
MailboxProcessor.Start(fun (inbox : MailboxProcessor<Message>) ->
/* loop implementation */
)
// other stuff
let configureApp (app : IApplicationBuilder) =
app.UseSignalR(fun routes -> routes.MapHub<JsonBlobHub>(PathString "/blobhub")) |> ignore
app.UseGiraffe webApp // webApp defined elsewhere, not important
let configureServices (services : IServiceCollection) =
services.AddSingleton<MailboxProcessor<Message>>(agentFactory) |> ignore
services.AddGiraffe() |> ignore
services.AddSignalR() |> ignore
let main argv =
WebHostBuilder() =
.UseKestrel()
.UseWebRoot("WebRoot")
.Configure(Action<IApplicationBuilder> configureApp)
.ConfigureServices(configureServices)
.ConfigureLogging(configureLogging)
.Build()
.Run
0
当 SignalR 客户端连接到 /blobhub
时,连接意外关闭,因为应用程序在尝试激活 BlobHub
class 时无法解析 MailboxProcessor<Message>
。
不过,我有点难过,因为我已经在 configureServices
函数中明确地在容器中注册了 MailboxProcessor<Message>
类型。有人看到这段代码有问题吗?或者也许我假设这些东西应该起作用,但有一些我不知道的它们不应该起作用的原因?
嗯....原来是我干了件蠢事,一不小心就有了两个Message
的定义。我的 JsonBlobHub
使用的是一种定义,而 agentFactory
和 configureServices
使用的是另一种定义。一旦我删除了 Message
的定义之一,DI 容器就会像您期望的那样解析 JsonBlobHub
的激活。
我会说这最终是浪费时间,但它确实导致了一个很好的独立示例,它结合使用 F#、Giraffe、ASP.NET Core 和 SignalR,并进行了演示所有的部分都能很好地结合在一起。