我正在尝试配置MVC 5应用程序以使用SignalR 2.2.x并将服务注入到我的NotificationsHub
。我们正在将Autofac用于MVC,但是我不确定如何正确配置它。存在NuGetAutofac.Integration.SignalR (3.0.2)
和的Autofac文档Autofac.Integration.Mvc (3.3.4)
。
到目前为止,我正在通过以下方式注册集线器:
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(...)
,由于MVC和SignalR集成软件包中都存在对它的调用,因此模棱两可。怎么办?我无法确认服务的构造器注入是否适用于我正在使用的集线器。
编辑
我可以用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>());
}
}
如何正确地做到这一点?
您应该明确告诉SignalRAutofacDependencyResolver
在映射它时使用。我假设您知道Startup
您必须在课堂上打电话app.MapSignalR();
映射它时,应该告诉它使用自定义依赖项解析器(AutofacDependencyResolver
)。
这是我的方法:
var resolver = new AutofacDependencyResolver(container);
app.MapSignalR(new HubConfiguration
{
Resolver = resolver
});
这样,您就直接告诉SignalR使用哪个依赖解析器。
我有一个用于SignalR Dependency Injection的GitHub存储库,但未配置为使用MVC。不过,我认为这将为您提供有关如何创建配置的提示。
注意:如果使用的是OWIN中间件,请确保不要使用GlobalHost
静态属性AT ALL,因为它会产生巨大的不一致。
OWIN集成中的一个常见错误是使用GlobalHost。在OWIN中,您可以从头开始创建配置。使用OWIN集成时,不应在任何地方引用GlobalHost。
再次,检查我给您的仓库,以了解如何执行此操作。
希望对您有所帮助:)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句