Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 为什么长颈鹿/AspNetCore&x2B;信号器依赖项注入无法解析MailboxProcessor单例?_Asp.net Core_Dependency Injection_F#_F# Giraffe - Fatal编程技术网

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.FSharpMailboxProcessor
1[MyModule+Message]”的服务。”。这让我想知道使用DU类型作为
MailboxProcessor
的类型参数是否有问题,但我不太确定如何证明itHmmm。您可以尝试通过创建
MailboxProcessor
类并使用该类进行测试来排除DU类型参数问题。如果
MailboxProcessor
MailboxProcessor
失败的情况下成功,那么您关于DU类型参数的假设似乎是可能的。这似乎是问题所在
MailboxProcessor
解析得很好:呜呜:嗯……事实往往如此,我只是犯了一个愚蠢的错误。我在两个不同的模块中定义了我的
消息
类型,这是移动的结果,我的工厂功能和DI注册看到了一个版本,而集线器看到了另一个版本。DI相当聪明,但并不神奇;-)一旦我删除了其中一个定义,系统就运行得很好。