2016-08-09 10 views
1

私は、WebApiも使用するSignalR 2プロジェクトを持っています。私はこれにAutoFacを統合しようとしています。 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に追加しようとしています:

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パッケージが2つありますが、その2つだけであることを確認してください。

私はいくつかの変更も加えましたが、ここで私はそれをやった。 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); 

私がやったもう一つの間違いは、ハブ自体をコントローラに注入できると考えていることでした。あなたはそれを行うことはできません。だから、あなたがハブのコンテキストを通過しなければならないことが必要な場合、私はハブのコンテキストを注入する方法を見つける必要があります。それは私のtodoです。

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はサイトのチュートリアルと同じです。そこには何も変わらない。