Регистрация SignalR 2.0 в VS2012 и внедрение зависимостей

Я был в состоянии работать с SignalR 1.13 с моим собственным DI следующим образом:

//Funq container
GlobalHost.DependencyResolver = new FunqDependencyResolver(container); 
RouteTable.Routes.MapHubs();

Теперь с новой версией 2.0 я застрял.

using Microsoft.Owin;
using Owin;
//SignalR 2.0 no longer uses RouteTable.Routes.MapHubs();
[assembly: OwinStartup(typeof(SignalRChat.Startup))]
namespace SignalRChat { 
    public class Startup {
        public void Configuration(IAppBuilder app) { app.MapSignalR(); }
    }
}

(Новая настройка SignalR 2.0 на скриншоте VS2013)

введите описание изображения здесь

Во-первых, это экран от VS2013 отсюда. В моем VS2012 Pro нет класса запуска Создать...-> OWIN. Я написал его от руки. Но теперь, как мне вызвать новый класс запуска, чтобы заменить старый MapHub() функционировать?

Во-вторых, я использовал DI, который запускает остальную часть веб-проекта. Как мне зарегистрировать signalR в моем DI сейчас?

РЕДАКТИРОВАТЬ --------------------------------------------

Еще немного к вопросу. Я создаю свой DI-контейнер в Global.asax.cs->Application_Start(), но SignalR Startup.cs->Configuration() автоматически создается и вызывается. Как передать мой DI-контейнер в SignalR Startup?

Global.asax.cs (запускается автоматически при запуске приложения)

protected void Application_Start(object sender, EventArgs e)
{
    var appHost = new AppHost(); //DI init
    appHost.Init();
    var container = appHost.Container; //DI container here
    var resolver = new FunqDependencyResolver(container);
}

SignalRStarter.cs (он также запускается автоматически при запуске приложения)

[assembly: OwinStartup(typeof(WebApp.SignalRStarter))]
namespace WebApp {
    public class SignalRStarter {
        public FunqDependencyResolver FunqDependencyResolver { get; set; }
        public bool EnableDetailedErrors { get; set; }

        public void Configuration(IAppBuilder app) {
            app.MapSignalR(new HubConfiguration() {
                EnableDetailedErrors = EnableDetailedErrors,
                Resolver = FunqDependencyResolver
            });
        }
    }
}

2 ответа

Решение

Вы по-прежнему можете установить преобразователь зависимостей так же, как в 1.1.3. Однако лучший подход (делает то же самое, только чище):

app.MapSignalR(new HubConfiguration
{
    Resolver = new FunqDependencyResolver(container)
});

Замечания: app.MapSignalR() это новый RouteTable.Routes.MapHubs() для SignalR 2.0.0+, что означает, что вы больше не должны делать RouteTable.Routes.MapHubs(),

Теперь на ваш вопрос о том, что в VS2012 нет класса запуска Owin, это нормально! Просто создайте новый пустой класс и скопируйте и вставьте код в свой класс. Никаких других настроек не требуется.

Я использовал этот подход ниже без изменения HubConfiguration.

Использование существующего контейнера IoC в SignalR 2.0

Я поделился контейнером для SignalR и моего веб-приложения, и, разрешив Hub из CustomHubActivator, я могу добавить что угодно в качестве параметров в мой Hub.

Другие вопросы по тегам