Почему внедрение зависимостей Giraffe/AspNetCore + SignalR не может разрешить синглтон MailboxProcessor?
Я настраиваю простое приложение 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 ответ
Ну.... получается, что я сделал глупость и случайно получил два определения Message
, мой JsonBlobHub
использовал одно определение в то время как agentFactory
а также configureServices
использовали другое определение. Однажды я удалил одно из определений Message
контейнер DI разрешил активацию JsonBlobHub
как и следовало ожидать.
Я бы сказал, что это пустая трата времени, но на самом деле это привело к хорошему небольшому самодостаточному примеру совместного использования F#, Giraffe, ASP.NET Core и SignalR и демонстрации того, что все части прекрасно сочетаются друг с другом.,