2012-06-12 2 views
3

Недавно я обновился до новой версии отличной библиотеки SignalR и переместил все мои инъекции зависимостей из StructureMap в Ninject, поскольку Ninject, казалось, лучше поддерживался.SignalR Dependency Resolver не работает с Javascript Hubs

У меня есть инъекция зависимостей, отлично работающая для уведомлений на стороне сервера, используя «Трансляция через концентратор снаружи концентратора», описанную здесь: https://github.com/SignalR/SignalR/wiki/Hubs.

Проблема, которую я получаю, заключается в том, что все сообщения SignalR, происходящие из концентратора Javascript, похоже, не запускают инъекцию зависимости.

Я также использую MVC4 WebAPI, который также требует некоторого ботинка для ботинка, чтобы получить зависимость от инъекций.

Вот мой Hub:

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 Bootstrapper:

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) 
    { 

    }   
} 

Я уведомляя клиентов о ServerSide через 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); 
    } 
} 

Прокси работает нормально, вводится в контроллеры или их зависимости и может отправлять сообщения клиентам.

Когда клиенты пытаются вызвать SignalR с помощью JavaScript, я получаю следующее сообщение об ошибке:

No parameterless constructor defined for this object. 

Похоже Ninject это не вызывается, поскольку зависимости не впрыскивают в конструктор. Что мне нужно сделать, чтобы заставить Injection Dependency работать и для вызовов Javascript?

Update -

Следуя совету от DFowler, я заменил Разрешитель в PostApplicationStart. Отладка Я вижу в окне Immediate Window, что SignalR.GlobalHost.Resolver имеет тип NinjectDependencyResolver, но его все еще не работает. Я получаю ту же ошибку - без конструктора без парамедиа.

Затем я удалил библиотеку NuGet NinjectDependencyResolver NuGet и добавил исходный файл в мое решение, и использую его для целей отладки. Отладка в GetService и GetServices показывает, что ни один из методов никогда не вызывается в NinjectDependencyResolver.

Любые идеи?

ответ

3

Проблема была я не называется RouteTable.Routes.MapHubs:

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

Из документов https://github.com/SignalR/SignalR/wiki/Extensibility:

ПРИМЕЧАНИЕ: НЕ переопределить глобальные распознаватель в PreApplicationStart, он не будет работать, или будет работать только иногда. Сделайте это в PostApplicationStart (используя WebActivator) или в Global.asax.

Смежные вопросы