Ninject 信号器依赖项解析程序无法从Javascript集线器工作
我最近升级到了优秀信号器库的新版本,并将所有依赖项注入从StructureMap移到了Ninject,因为Ninject似乎得到了更好的支持 我已经使用这里描述的“从中心外部通过中心广播”使依赖项注入在服务器端通知中工作良好: 我遇到的问题是,所有来自Javascript中心的信号器消息似乎都没有触发依赖项注入 我还使用了MVC4WebAPI,这也需要一些技巧才能让依赖注入工作起来 这是我的中心:Ninject 信号器依赖项解析程序无法从Javascript集线器工作,ninject,signalr,Ninject,Signalr,我最近升级到了优秀信号器库的新版本,并将所有依赖项注入从StructureMap移到了Ninject,因为Ninject似乎得到了更好的支持 我已经使用这里描述的“从中心外部通过中心广播”使依赖项注入在服务器端通知中工作良好: 我遇到的问题是,所有来自Javascript中心的信号器消息似乎都没有触发依赖项注入 我还使用了MVC4WebAPI,这也需要一些技巧才能让依赖注入工作起来 这是我的中心: public class PresenceHub : Hub, IPresenceHub {
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没有被调用,因为依赖项没有被注入构造函数。我需要做什么才能让依赖项注入也为Javascript调用工作
更新--
根据DFowler的建议,我在PostApplicationStart中替换了解析器。调试我可以在即时窗口中看到SignalR.GlobalHost.Resolver是NinjectDependencyResolver类型,但它仍然不工作。我得到相同的错误-没有无参数构造函数
然后,我删除了NinjectDependencyResolver NuGet库,并将源文件添加到我的解决方案中,并将其用于调试目的。对GetService和GetServices的调试表明,NinjectDependencyResolver中从未调用过这两个方法
有什么想法吗?来自文档:
注意:不要在PreApplicationStart中重写全局冲突解决程序,它将不起作用,或者只在某些时候起作用。在PostApplicationStart(使用WebActivator)或Global.asax中执行此操作。问题是我没有调用RouteTable.Routes.MapHubs:
GlobalHost.DependencyResolver = new SignalRNinjectResolver(NinjectWebCommon.Kernel);
RouteTable.Routes.MapHubs(new SignalRNinjectResolver(NinjectWebCommon.Kernel));
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);
}
}
No parameterless constructor defined for this object.
GlobalHost.DependencyResolver = new SignalRNinjectResolver(NinjectWebCommon.Kernel);
RouteTable.Routes.MapHubs(new SignalRNinjectResolver(NinjectWebCommon.Kernel));