ninject - ninject SignalR依赖解析器无法从Javascript集线器工作

  显示原文与译文双语对照的内容

我最近升级到了新版本的SignalR库,并将所有依赖注入从StructureMap移动到 tmodel,因为rtc好像更好。

我已经使用这里描述的"。通过集线器外部的集线器进行广播"对服务器端通知的依赖注入工作正常: https://github.com/SignalR/SignalR/wiki/Hubs

我得到的问题是来自 Javascript hub的所有SignalR消息似乎并没有触发依赖注入。

我也使用 MVC4 WebAPI,它也需要一些鞋horning来获得依赖注入。

这是我的中心:


public class PresenceHub : Hub, IPresenceHub


{


 private readonly IUserRepository _userRepository;


 private readonly IFormsAuthenticationProvider _formsAuthenticationProvider;



 public PresenceHub(IFormsAuthenticationProvider formsAuthenticationProvider, IUserRepository userRepository)


 {


 _userRepository = userRepository;


 _formsAuthenticationProvider = formsAuthenticationProvider;


 }



 public void PresenceChange(string presence)


 {


 var user = _userRepository.FindById(_formsAuthenticationProvider.GetUserId());


 var rosterEntry = Mapper.Map<User, RosterEntryDto>(user);


 rosterEntry.Presence = presence;


 Clients.updatePresence(rosterEntry);


 }


}



以下是我的Ninject引导程序:


Namespace SLx.Web.App_Start


{


using System;


using System.Web;



using Microsoft.Web.Infrastructure.DynamicModuleHelper;



using Ninject;


using Ninject.Web.Common;



public static class NinjectWebCommon 


{


 private static readonly Bootstrapper bootstrapper = new Bootstrapper();



 public static void Start() 


 {


 DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));


 DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));


 bootstrapper.Initialize(CreateKernel);


 }



 public static void Stop()


 {


 bootstrapper.ShutDown();


 }



 private static IKernel CreateKernel()


 {


 var kernel = new StandardKernel();


 kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);


 kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();



//SignalR Ninject Resolver


 GlobalHost.DependencyResolver = new SignalR.Ninject.NinjectDependencyResolver(kernel);



//WebApi Ninject Resolver


 GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);



 RegisterServices(kernel);


 return kernel;


 }



 private static void RegisterServices(IKernel kernel)


 {



 } 


}



我正在通过如下定义的PresenceProxy在服务器端通知客户端:


public class PresenceHubProxy : IPresenceHubProxy


{


 private readonly IHubContext _hubContext;



 public PresenceHubProxy()


 {


 _hubContext = GlobalHost.ConnectionManager.GetHubContext<PresenceHub>();


 }



 public void NotifyLogin(RosterEntryDto user)


 {


 _hubContext.Clients.updatePresence(user);


 }



 public void NotifyLogout(RosterEntryDto user)


 {


 _hubContext.Clients.updatePresence(user);


 }


}



代理工作正常,注入控制器或者它们的依赖项,并且可以向客户端发送消息。

当客户端尝试通过Javascript调用SignalR时,会出现以下错误:


No parameterless constructor defined for this object.



因为依赖项没有被注入到构造函数中,所以它看起来没有被调用。 我需要做什么才能得到Javascript调用的依赖注入?

更新-

根据DFowler的建议,我在PostApplicationStart中替换了解析器。 可以在即时窗口中看到 SignalR.GlobalHost.Resolver 是NinjectDependencyResolver类型,但是它仍然不工作,我得到同样的错误- 没有paramaterless构造函数。

然后删除 NinjectDependencyResolver NuGet库并将源文件添加到解决方案中,并使用它进行调试。 对GetService和GetServices的调试表明,在NinjectDependencyResolver中不调用任何方法。

有什么想法吗?

时间: 原作者:

问题是我没有叫 RouteTable.Routes.MapHubs:


GlobalHost.DependencyResolver = new SignalRNinjectResolver(NinjectWebCommon.Kernel);


RouteTable.Routes.MapHubs(new SignalRNinjectResolver(NinjectWebCommon.Kernel));



原作者:

在文档 https://github.com/SignalR/SignalR/wiki/Extensibility 中:

注意:不要重写PreApplicationStart中的全局解析程序,它不会工作,或者只有有时才能工作。 在 PostApplicationStart ( 使用 WebActivator ) 或者 Global.asax. 中执行

...