Dependency injection 如何在MVC 5应用程序中配置Autofac和SignalR

Dependency injection 如何在MVC 5应用程序中配置Autofac和SignalR,dependency-injection,asp.net-mvc-5,signalr,autofac,signalr-hub,Dependency Injection,Asp.net Mvc 5,Signalr,Autofac,Signalr Hub,我正在尝试将MVC5应用程序配置为使用Signalr2.2.x,并将服务注入我的通知shub。 我们正在使用Autofac for MVC,但我不确定如何正确配置它。 针对NuGetAutofac.Integration.signar(3.0.2)和Autofac.Integration.Mvc(3.3.4)提供了Autofac文档 到目前为止,我正在通过以下方式注册集线器: ContainerBuilder=newcontainerbuilder(); //注册MVC控制器。 注册控制器(类型

我正在尝试将MVC5应用程序配置为使用Signalr2.2.x,并将服务注入我的
通知shub
。 我们正在使用Autofac for MVC,但我不确定如何正确配置它。 针对NuGet
Autofac.Integration.signar(3.0.2)
Autofac.Integration.Mvc(3.3.4)
提供了Autofac文档

到目前为止,我正在通过以下方式注册集线器:

ContainerBuilder=newcontainerbuilder();
//注册MVC控制器。
注册控制器(类型化(MVCAPApplication).Assembly);
builder.RegisterType().AsImplementedInterfaces();
builder.RegisterType().AsImplementedInterfaces();
registerUBS(Assembly.getExecutionGassembly());
IContainer容器=builder.Build();
SetResolver(新的AutofacDependencyResolver(容器));
然而,对
.SetResolver(…)
的调用是含糊不清的,因为它存在于MVC和SignalR集成包中。现在怎么办?我无法确认我的服务的构造函数注入是否适用于我正在使用的集线器

编辑

我可以用Autofac很好地配置MVC5。我迷路的地方是如何使用Autofac信号集成NuGet对SignalR执行相同的操作。 请参见下文。

这是我的创业课程:

公共部分类启动
{
公共无效配置(IAppBuilder应用程序)
{
var defaultFactory=LogManager.Use();
defaultFactory.Directory(@D:\\n服务总线\\);
defaultFactory.Level(LogLevel.Debug);
var container=ConfigureAutofac(应用程序);
配置ServiceBus(容器、应用程序);
app.UseAutofacMiddleware(容器);//向OWIN注册
app.UseAutofacMvc();
ConfigureAuth(app);
GlobalConfiguration.Configuration.UseSqlServerStorage(“hangfire”);
配置信号器(app);
}
}
这是我配置信号器的部分:

公共部分类启动
{
公共无效配置信号器(IAppBuilder应用程序)
{
var builder=new ContainerBuilder();
builder.registerUBS(Assembly.getExecutionGassembly()).PropertiesAutowired();
builder.RegisterType().As().PropertiesAutowired();
var container=builder.Build();
//var container=new AutofacContainer().container;
var解析器=新的AutofacDependencyResolver(容器);
//任何连接或集线器接线和配置都应位于此处
应用程序MapSignalR(新HUB配置
{
分解器=分解器,
EnableJSONP=true,
EnableDetailedErrors=true,
EnableJavaScriptProxies=true
});
RegisterInstance(resolver.Resolve());
}
}

如何正确执行此操作?

映射时,应明确告知信号器使用
AutofacDependencyResolver
。 我假设您知道在
启动
类中必须调用
app.mapsigner();

映射时,应该告诉它使用自定义依赖项解析程序(AutofacDependencyResolver)

我是这样做的:

var解析器=新的AutofacDependencyResolver(容器);
应用程序MapSignalR(新HUB配置
{
分解器=分解器
});
这样,您就可以直接告诉signer要使用哪个依赖项解析器

我有一个,但它没有配置为使用MVC。不过,我认为它会给你一个如何创建配置的提示

注意:如果您使用的是OWIN中间件,请确保根本不要使用
GlobalHost
静态属性,因为它将存在大量的不一致性

OWIN集成中的一个常见错误是在OWIN中使用GlobalHost.in 您从头开始创建配置。不应引用 使用OWIN集成时,GlobalHost anywhere

再次检查我给你的回购协议,看看如何做到这一点

希望这有帮助:) 祝你好运!

我的结论是(请注意评论):

公共部分类启动
{
公共无效配置(IAppBuilder应用程序)
{
ConfigureAuth(app);
IContainer容器=自动传真配置(应用程序);
app.useautofac中间件(容器);
app.UseAutofacMvc();
SetResolver(新的Autofac.Integration.Mvc.AutofacDependencyResolver(容器));
GlobalConfiguration.Configuration.DependencyResolver=新的AutoFacWebAPI DependencyResolver(容器);
应用程序UseAutofacWebApi(GlobalConfiguration.Configuration);
var hubConfiguration=新的Microsoft.AspNet.signal.hubConfiguration()
{
//从容器解析预溶器
解析程序=容器。解析(),
};
应用程序MapSignal(HUB配置);
RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
_

private static IContainer AutofacConfig(IAppBuilder应用程序)
{
var builder=new ContainerBuilder();
注册标志(建造商);
返回builder.Build();
}
_

private static void registersignal(ContainerBuilder生成器)
{
//将Autofac解析器注册到容器中,以便稍后设置到HUB配置中

builder.RegisterType(最初找到)和逻辑思维,以确定将ConnectionManager注册为IConnectionManager,例如:

<package id="Autofac.SignalR" version="3.0.2" targetFramework="net471" />
有关更多信息:


谢谢你的精彩回答。我还没有让它在我这方面发挥作用。因为我使用的是MVC5,所以我的项目设置略有不同。我确实使用了OWIN。有一件事:我抓到了你的repo,并进行了软件包更新以匹配版本号
// during creation of the IContainer, register signalr hubs automatically
var executingAssembly = Assembly.GetExecutingAssembly();
builder.RegisterHubs(executingAssembly);

// alternatively register hubs individually
// ExternallyOwned() ensures SignalR is allowed to control disposal of the hubs rather than Autofac.
builder.RegisterType<NotificationHub>().ExternallyOwned();
// replace the Signalr dependency resolver once your IContainer 'container' is ready
GlobalHost.DependencyResolver = new AutofacDependencyResolver(container);

// or this can alternatively be set in the HubConfiguration instance when using OWIN IAppBuilder map.RunSignalR(hubConfiguration);
var hubConfiguration = new HubConfiguration
{
    Resolver = new AutofacDependencyResolver(container),
    //...
}