2012-06-12 58 views
3

我最近升級到了優秀的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中都沒有調用任何方法。

任何想法?

回答

3

問題是我沒有打電話RouteTable.Routes.MapHubs:

GlobalHost.DependencyResolver = new SignalRNinjectResolver(NinjectWebCommon.Kernel); 
RouteTable.Routes.MapHubs(new SignalRNinjectResolver(NinjectWebCommon.Kernel));