Я пытаюсь настроить приложение MVC 5 на использование SignalR 2.2.x и внедрить службу в мой NotificationsHub. Мы используем Autofac для MVC, но я не уверен, как правильно его настроить. Документация Autofac существует для NuGet Autofac.Integration.SignalR (3.0.2) и Autofac.Integration.Mvc (3.3.4).Как настроить Autofac и SignalR в приложении MVC 5
Что я делаю до сих пор регистрируют концентраторов с помощью:
ContainerBuilder builder = new ContainerBuilder();
// Register MVC controllers.
builder.RegisterControllers(typeof(MvcApplication).Assembly);
builder.RegisterType<ServiceForSignalRHub>().AsImplementedInterfaces();
builder.RegisterType<...>().AsImplementedInterfaces();
builder.RegisterHubs(Assembly.GetExecutingAssembly());
IContainer container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
Однако вызов .SetResolver (...) является ambigious, как она существует в обоих MVC и SignalR пакетов интеграции. Что теперь? Я не могу подтвердить, работает ли контрструктура моего сервиса для концентратора, который я использую.
EDIT
Я могу настроить MVC5 с Autofac просто отлично. Где я заблудился, как сделать то же самое с SignalR, используя интеграцию сигналов Autofac Signal NuGet. См. Ниже.
Это мой класс запуска:
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
var defaultFactory = LogManager.Use<DefaultFactory>();
defaultFactory.Directory("@D:\\NServiceBus\\");
defaultFactory.Level(LogLevel.Debug);
var container = ConfigureAutofac(app);
ConfigureServiceBus(container, app);
app.UseAutofacMiddleware(container); // REGISTER WITH OWIN
app.UseAutofacMvc();
ConfigureAuth(app);
GlobalConfiguration.Configuration.UseSqlServerStorage("hangfire");
ConfigureSignalR(app);
}
}
Это та часть, где я устанавливаю SignalR:
public partial class Startup
{
public void ConfigureSignalR(IAppBuilder app)
{
var builder = new ContainerBuilder();
builder.RegisterHubs(Assembly.GetExecutingAssembly()).PropertiesAutowired();
builder.RegisterType<MaintenanceService>().As<IMaintenanceService>().PropertiesAutowired();
var container = builder.Build();
//var container = new AutofacContainer().Container;
var resolver = new AutofacDependencyResolver(container);
// Any connection or hub wire up and configuration should go here
app.MapSignalR(new HubConfiguration
{
Resolver = resolver,
EnableJSONP = true,
EnableDetailedErrors = true,
EnableJavaScriptProxies = true
});
builder.RegisterInstance(resolver.Resolve<IConnectionManager>());
}
}
Как это может быть сделано правильно?
спасибо за отличный ответ. У меня не получилось работать с моей стороны. Поскольку я использую MVC5, моя настройка проекта несколько отличается. Я использую OWIN. Одна вещь: я схватил вас репо и сделал обновление пакета, чтобы соответствовать номеру версии, который я использую. Теперь демо не будет работать. – John
Да, это из-за объединительной платы SignalR, которая использует Redis. Удалите из него все связанные с Редисом вещи. Я зафиксирую изменения, как только у меня появится окно, но до этого удалите все, что вы найдете о Redis: app.UseRedis из Startup и пакета Microsoft.AspNet.SignalR.Redis NuGet. Он будет работать :) Спросите, есть ли какие-либо проблемы, я постараюсь его обновить :) Удачи! –
Спасибо, что сделал. Я все еще не уверен, как настроить MVC Autofac вместе с SignalR Autofac, но следующая проблема заключается в том, что я получаю ошибку SignalR JS: «SignalR: Connection не полностью инициализирован. Используйте .start(). Done() или .start() .fail() для запуска логики после запуска соединения. " Любой совет? Еще раз спасибо! – John