为什么Giraffe / AspNetCore + SignalR依赖项注入无法解析MailboxProcessor单例?

时间:2018-09-18 21:36:05

标签: asp.net-core dependency-injection f# f#-giraffe

我正在设置一个简单的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时,由于应用程序在尝试激活MailboxProcessor<Message>类时无法解析BlobHub,因此连接意外关闭。

但是,我有些困惑,因为我已经在MailboxProcessor<Message>函数的容器中清楚地注册了configureServices类型。有人在这段代码中看到问题吗?或者也许我以为这些事情应该起作用,并且出于某些原因我不应该知道它们不应该?

1 个答案:

答案 0 :(得分:2)

好吧...。事实证明,我做了一件愚蠢的事情,偶然地有两个Message的定义。我的JsonBlobHub使用一个定义,而agentFactoryconfigureServices使用另一个定义。一旦删除了Message的定义之一,DI容器就可以按照您的期望解决JsonBlobHub的激活。

我想说这很浪费时间,但实际上确实带来了一个很好的小实例,它包含了一起使用F#,Giraffe,ASP.NET Core和SignalR,并演示了所有这些内容一起玩。