我最近升級到了優秀的SignalR庫的新版本,並將所有的依賴注入從StructureMap移動到Ninject,因爲Ninject似乎得到了更好的支持。SignalR依賴關係解析器無法從Javascript集線器工作
我已經得到了服務器端通知的依賴注入工作正常使用「從Hub外部通過Hub進行廣播」,如下所述:https://github.com/SignalR/SignalR/wiki/Hubs。
我得到的問題是所有源自Javascript集線器的SignalR消息似乎都不會觸發依賴注入。
我也使用MVC4 WebAPI,它也需要一些鞋蹄來獲得依賴注入的工作。
這裏是我的樞紐:
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.
它看起來像Ninject沒有被調用,因爲它的依賴不會被注入到構造函數。我需要做些什麼才能讓依賴注入爲Javascript調用工作?
更新 -
在從DFowler的建議,我已經取代了PostApplicationStart解析器。調試我可以在即時窗口看到SignalR.GlobalHost.Resolver屬於NinjectDependencyResolver類型,但它仍然不起作用,我得到了同樣的錯誤 - 沒有無參數的構造函數。
我已經刪除了NinjectDependencyResolver NuGet庫,並將源文件添加到我的解決方案中,並將其用於調試目的。在GetService和GetServices上調試表明,在NinjectDependencyResolver中都沒有調用任何方法。
任何想法?