为什么 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 使用的是一种定义,而 agentFactoryconfigureServices 使用的是另一种定义。一旦我删除了 Message 的定义之一,DI 容器就会像您期望的那样解析 JsonBlobHub 的激活。

我会说这最终是浪费时间,但它确实导致了一个很好的独立示例,它结合使用 F#、Giraffe、ASP.NET Core 和 SignalR,并进行了演示所有的部分都能很好地结合在一起。