Недавно я обновился до новой версии отличной библиотеки 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.
Любые идеи?