我想配置一个MVC 5应用程序以使用SignalR 2.2.x并将服务注入到我的NotificationsHub中。 我们使用Autofac for MVC,但我不确定如何正确配置它。 Autofac文档存在NuGet Autofac.Integration.SignalR(3.0.2)和Autofac.Integration.Mvc(3.3.4)。如何在MVC 5应用程序中配置Autofac和SignalR
我在做什么,到目前为止是通过注册中心:
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集成软件包存在。怎么办?我无法确认我的服务的构造器注入是否适用于我正在使用的Hub。
编辑
我可以Autofac就好配置MVC5。我迷失的地方是如何使用Autofac Signal集成NuGet来处理SignalR。 请参阅下面。
这是我的启动类:
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
是的,这是因为使用Redis的SignalR背板。从中删除所有与Redis相关的事物。我会尽快提交更改,但在此之前,请删除关于Redis的所有内容:启动时的app.UseRedis和Microsoft.AspNet.SignalR.Redis NuGet包。它会工作:)询问是否有任何问题,我会尽力更新它:)祝你好运! –
谢谢你做到了。我仍然不确定如何配置MVC Autofac和SignalR Autofac,但接下来的问题是我得到了一个SignalR JS错误:“SignalR:Connection尚未完全初始化,请使用.start()。done()或.start ().fail()在连接启动后运行逻辑。“有什么建议?再次感谢! – John