1

我无法让 Hub 和我的存储库同时工作。我相信这是因为使用了两个不同的内核来进行绑定。当我执行下面引用的建议修复(一个内核)时,客户端停止处理广播消息。

我基于SignalR Stock Ticker构建了一个应用程序。它按预期工作。然后我按照SignalR中的依赖注入将 DI 与 Ninject 结合起来。这也很好。然后我将我的服务项目添加到解决方案中。将我的绑定添加到 NinjectWebCommon 以包含我的服务存储库。我修改了我的单例类以包含存储库。

    public class AndonDisplay : IAndonDisplay
{
    private readonly IReadOnlyRepository _repo;
    private readonly AndonDisplayMsgSet _msgSet;

    private readonly object _updateAndonDisplayLock = new object();
    private volatile bool _updatingAndonDisplay = false;

    public AndonDisplay(IHubConnectionContext<dynamic> clients, IReadOnlyRepository repo)
    {
        _repo = repo;
        Clients = clients;
        _msgSet = new AndonDisplayMsgSet { Advisory = "", Maintenance = "<div class='lblDT'>OK</div>", Supervisor = "OK", Materials = "OK" };
    }

此时,从未调用过单例。我看不到任何错误消息。根本不叫。然后,我在下面链接的帖子“原始问题......”中以最多票数对答案进行了建议的更改。这修复了除 Clients.All 广播之外的所有内容。它现在没有在客户端处理。我有一个在单例中工作的仓库。我看到 Clients.All 被调用。客户端的脚本永远不会执行。

我发现了这个开发人员的问题...发布了原始问题。 正如开发人员在发布的最后一个“答案”的评论中所述......

“......我不知道如何将这两个部分放在一起。股票代码示例让你在 Startup.cs 中创建一个内核,但我也在 NinjectWebCommon 中创建一个内核,他们不知道—— Dismissile 2014 年 1 月 22 日 21:31

有人对此有解决方案吗?

更新:

如果我从绑定语句中删除 .InSingletonScope() :

            kernel.Bind<IAndonDisplay>().To<AndonDisplay>(); //.InSingletonScope();  // Make it a singleton object.

那么我注入 IAndonDisplay 的集线器有一个功能齐全的存储库?!?!

这是我的 NinjectWebCommon RegisterServices

        private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<AndonVistechContext>().ToSelf().InRequestScope();
        kernel.Bind<IRepository>().To<EntityFrameworkRepository<AndonVistechContext>>().InRequestScope();
        kernel.Bind<IReadOnlyRepository>().To<EfReadOnlyRepository.EntityFrameworkReadOnlyRepository<AndonVistechContext>>().InRequestScope();
        kernel.Bind<IAndonDisplay>().To<AndonDisplay>(); //.InSingletonScope();  // Make it a singleton object.
        kernel.Bind(typeof(IHubConnectionContext<dynamic>)).ToMethod(context => GlobalHost.DependencyResolver.Resolve<IConnectionManager>().GetHubContext<AndonDisplayHub>().Clients).WhenInjectedInto<IAndonDisplay>();
    }

我确定我遗漏了一些明显的东西。

4

0 回答 0