Asp.net core 为什么长颈鹿/AspNetCore&x2B;信号器依赖项注入无法解析MailboxProcessor单例?
我正在设置一个简单的应用程序,其中包含一个或两个端点和一个信号集线器。我所拥有的是这样的:Asp.net core 为什么长颈鹿/AspNetCore&x2B;信号器依赖项注入无法解析MailboxProcessor单例?,asp.net-core,dependency-injection,f#,f#-giraffe,Asp.net Core,Dependency Injection,F#,F# Giraffe,我正在设置一个简单的应用程序,其中包含一个或两个端点和一个信号集线器。我所拥有的是这样的: type JsonBlob = JsonProvider<"Blob.json"> type Message = | GetBlobs of AsyncReplyChannel<JsonBlob.Root list> | PostBlob of JsonBlob.Root type JsonBlobHub(agent : MailboxProcessor<
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
类型JsonBlob=JsonProvider
类型消息=
|AsyncReplyChannel的GetBlob
|JsonBlob.Root的PostBlob
类型JsonBlobHub(代理:MailboxProcessor)=
继承中心()
成员self.RespondToClient()=
让blobs=agent.PostAndReply(GetBlobs)
self.Clients.All.SendAsync(“ReceiveBlobList”,blobs)
let代理工厂(服务提供商:IServiceProvider)=
让thing=serviceProvider.GetService()
MailboxProcessor.Start(乐趣(收件箱:MailboxProcessor)->
/*循环实现*/
)
//其他东西
let configureApp(应用程序:IApplicationBuilder)=
app.usesigner(有趣的路线->路线.MapHub(路径字符串“/blobhub”))|>忽略
app.usegraffe webApp//webApp在别处定义,不重要
let configureServices(服务:IServiceCollection)=
services.AddSingleton(agentFactory)|>忽略
services.AddGiraffe()|>忽略
services.AddSignalR()|>忽略
让主argv=
WebHostBuilder()=
.UseKestrel()
.UseWebRoot(“WebRoot”)
.Configure(操作配置应用程序)
.ConfigureServices(配置服务)
.ConfigureLogging(配置日志记录)
.Build()
跑
0
当信号器客户端连接到/blobhub
时,连接意外关闭,因为应用程序在尝试激活blobhub
类时无法解析MailboxProcessor
但是,我有点困惑,因为我已经在
configureServices
函数的容器中清楚地注册了MailboxProcessor
类型。有人看到这段代码有问题吗?或者我假设这些东西应该起作用,但我不知道有什么原因它们不应该起作用?嗯……结果是我做了一件愚蠢的事,无意中对消息有了两个定义。我的JsonBlobHub
使用了一个定义,而agentFactory
和configureServices
使用了另一个定义。一旦我删除了Message
的其中一个定义,DI容器就按照您的预期解决了JsonBlobHub
的激活问题
我想说这最终是在浪费时间,但它确实带来了一个很好的例子,将F#、Giraffe、ASP.NET Core和SignalR一起使用,并演示所有的部件都能很好地配合使用。不太熟悉SignalR以及它是如何进行DI的,但是您是否需要将JsonBlobHub
类注册到ASP.NET的DI容器中,以便它了解JsonBlobHub的构造函数参数?我不这么认为,因为错误消息确实指示了正确的类作为它试图解析的类型。i、 例如,“在尝试激活“MyModule+JsonBlobHub
”时,无法解析类型为“Microsoft.FSharp.Control.FSharpMailboxProcessor1[MyModule+Message]”的服务。”。这让我想知道使用DU类型作为MailboxProcessor
的类型参数是否有问题,但我不太确定如何证明itHmmm。您可以尝试通过创建MailboxProcessor
类并使用该类进行测试来排除DU类型参数问题。如果MailboxProcessor
在MailboxProcessor
失败的情况下成功,那么您关于DU类型参数的假设似乎是可能的。这似乎是问题所在MailboxProcessor
解析得很好:呜呜:嗯……事实往往如此,我只是犯了一个愚蠢的错误。我在两个不同的模块中定义了我的消息
类型,这是移动的结果,我的工厂功能和DI注册看到了一个版本,而集线器看到了另一个版本。DI相当聪明,但并不神奇;-)一旦我删除了其中一个定义,系统就运行得很好。