Почему инъекция зависимостей Giraffe / AspNetCore + SignalR не может разрешить синглтон MailboxProcessor? - PullRequest
0 голосов
/ 19 сентября 2018

Я настраиваю простое приложение 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 голосов
/ 19 сентября 2018

Ну .... получается, что я сделал глупость и случайно получил два определения Message.Мой JsonBlobHub использовал одно определение, в то время как agentFactory и configureServices использовали другое определение.Как только я удалил одно из определений Message, контейнер DI разрешил активацию JsonBlobHub, как и следовало ожидать.

Я бы сказал, что это потеря времени, но на самом деле это привело кхороший небольшой автономный пример совместного использования F #, Giraffe, ASP.NET Core и SignalR и демонстрация того, что все части прекрасно сочетаются друг с другом.

...