2016-08-09 96 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與網站上的教程相同。那裏沒有改變。