2016-08-09 53 views
1

我有一个SignalR 2项目,也使用WebApi,我试图将AutoFac集成到此。signalr,webapi和autofac

最初,我的启动类是这样的:

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    {   
     app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll); 

     app.MapSignalR(); 

     var httpConfig = new HttpConfiguration(); 

     httpConfig.MapHttpAttributeRoutes(); 

     app.UseWebApi(httpConfig); 
    } 
} 

不使用autofac,一切工作正常。现在,我想在AutoFac添加,所以我改变了我的启动类看起来像这样:

public void Configuration(IAppBuilder app) 
    { 
     var builder = new ContainerBuilder(); 

     var httpConfig = new HttpConfiguration(); 
     var hubConfig = new HubConfiguration(); 

     // Register your Web API controllers. 
     builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 
     builder.RegisterHubs(Assembly.GetExecutingAssembly()); 

     var container = builder.Build(); 
     httpConfig.DependencyResolver = new AutofacWebApiDependencyResolver(container); 
     hubConfig.Resolver = new AutofacDependencyResolver(container); 

     app.UseAutofacMiddleware(container); 
     app.MapSignalR("/signalr", hubConfig); 
     app.UseWebApi(httpConfig);    
    } 

现在发生的事情是我无法拨打电话到我的控制器,因为我得到的每一个404我打电话,之前工作过。我错过了什么?在web api的autofac快速入门指南中,有一个对app.UseAutofacWebApi(con​​fig)的调用,但是,该方法不存在,因此,不确定这是否是问题或内容。

+0

因此,根据WebAPI OWIN集成的文档,您添加了Autofac.WebApi2.Owin软件包并且UseAutofacWebApi扩展名不存在?你需要这个。你可以仔细检查? –

回答

0

我有同样的问题。对我来说,我必须单独添加集线器,并使用Nuget Packages Autofac.SignalR 3.0.2版和SignalR.Extras.Autofac v1.2.0。有几个Autofac SignalR软件包,确保它只有这两个。

虽然我也改变了一些其他的东西。这是我做到的。 var builder = new ContainerBuilder();

// REGISTER CONTROLLERS SO DEPENDENCIES ARE CONSTRUCTOR INJECTED 
builder.RegisterControllers(typeof(MvcApplication).Assembly); 
builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 

// Register the SignalR hubs. 
builder.RegisterType<UpdateHub>().ExternallyOwned(); 
builder.RegisterType<NotificationHub>().ExternallyOwned(); 

// BUILD THE CONTAINER 
var container = builder.Build(); 

// Configure SignalR with an instance of the Autofac dependency resolver. 
GlobalHost.DependencyResolver = new Autofac.Integration.SignalR.AutofacDependencyResolver(container); 
DependencyResolver.SetResolver(new Autofac.Integration.Mvc.AutofacDependencyResolver(container)); 
GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver((IContainer)container); 

// REGISTER WITH OWIN 
app.UseAutofacMiddleware(container); 
app.UseAutofacMvc(); 
app.MapSignalR(); 

ConfigureAuth(app); 

我做的另一个错误是认为集线器本身可以注入控制器。你不能那样做,所以如果你有这个需要,你必须通过中心环境来做,我需要找到一种方法来注入中心环境。这是我的待办事项。

var updateHubContext = GlobalHost.ConnectionManager.GetHubContext<UpdateHub>(); 
updateHubContext.Clients.All.update(); 

如果您需要生命周期范围,则必须使用ILifetimeScope接口解析您的集线器的依赖关系。您需要注入生命周期范围,然后从中解决它们。

private readonly ILifetimeScope _hubLifetimeScope; 
private readonly IEntityService<Update> _updateService; 

public UpdateHub(ILifetimeScope lifetimeScope) 
{ 
    //the AutofacWebRequest is important. It will not work without it 
    _hubLifetimeScope = lifetimeScope.BeginLifetimeScope("AutofacWebRequest"); 
    _updateService = _hubLifetimeScope.Resolve<IEntityService<Update>>(); 
} 

希望这会有所帮助。 JavaScript与网站上的教程相同。那里没有改变。