Инжекторы SignalR v2.0 в контроллере / сборке

1

Я хочу вызвать методы моего клиента из контроллера /ServiceAssembly

В настоящее время я использую

//Notify Others of the Login 
GlobalHost.ConnectionManager.GetHubContext<NotificationHub>().Clients.All.NotifyOthersAllOnLogin(string.Format("Recent Login({2}): {0} {1}", account.FirstName,account.LastName, account.LastLogin));

Но я хочу иметь возможность ввести экземпляр концентратора в контроллере, чтобы я мог использовать разные методы хаба.

Я использую StructureMap V3 для DependencyInjection.

Любая помощь/направление в этом отношении будет оценена

Теги:
signalr
asp.net-mvc-5.2
structuremap3

1 ответ

3
Лучший ответ

В SignalR есть учебник по инъекции зависимостей: http://www.asp.net/signalr/overview/signalr-20/extensibility/dependency-injection. Пример для NInject, но вы можете легко настроить его. То, что вам нужно запомнить, - это настроить контейнер DI перед инициализацией SignalR (отображение концентраторов).

Затем вы можете зарегистрировать свой контекст концентратора, чтобы иметь возможность его разрешить. Очень важно то, что вы регистрируете контекст концентратора после отображения концентраторов. Контекст концентратора может быть сохранен в переменной и сохранен до тех пор, пока вам нравится. Ваш метод настройки запуска будет выглядеть так:

public void Configure(IAppBuilder app)
{
    var resolver = new MyStructureMapResolver();

    // configure depdendency resolver
    GlobalHost.DependencyResolver = this.container.Resolve<IDependencyResolver>();

    // map the hubs
    app.MapSignalR();

    // get your hub context
    var hubContext = GlobalHost.ConnectionManager.GetHubContext<NotificationHub>();

    // register it in your structure map
    ObjectFactory.Inject<IHubContext>(hubContext);
}    

Чтобы ваш контекст хаба сильно набрал, вы можете сделать что-то вроде этого:

public interface INotificationHubContext {
    void NotifyOthersAllOnLogin(string msg);
}

Затем вы делаете это:

// get your hub context
var hubContext = GlobalHost.ConnectionManager.GetHubContext<NotificationHub, INotificationHubContext>();

// register it in your structure map
ObjectFactory.Inject<IHubContext<INotificationHubContext>>(hubContext);

Надеюсь это поможет.

  • 0
    Мне нравится ваш подход, но у меня уже есть DI, реализованный в моем проекте с использованием IHubActivator ... для внедрения зависимостей, создающих концентраторы ..... Но не удается ввести HubInstances в контроллер ... Ваше приложение показывает, что я должен зарегистрировать все свои концентраторы вручную с помощью контейнера DI ..... Знаете ли вы, как вы можете написать соглашение, чтобы ввести его же ...
  • 0
    SignalR ищет типы узлов с помощью службы IAssemblyLocator, которая возвращает все сборки для просмотра. Учитывая этот факт, вы можете скопировать это поведение, чтобы зарегистрировать все ваши концентраторы.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню