2016-07-25 6 views
2

シンプルインジェクタを使用してハブにシングルトンコントローラを注入したいとします。シンプルインジェクタを使用してSignalRハブにコントローラを注入する

私はすでに以下を試しましたが、ステータス500が返されました。

ハブコード:

public class EventDataHub : Hub 
    { 
     private static IEventDataController _dataController; 

     public EventDataHub(IEventDataController dataController) 
     { 
      _dataController = dataController; 
     } 

     public void Subscribe(string signal) 
     { 
      _dataController.Subscribe(signal, Context.ConnectionId); 
     } 
    } 

Startup.cs

public class Startup 
    { 
     public void Configuration(IAppBuilder app) 
     { 

      var container = new Container(); 

      var hybridLifestyle = Lifestyle.CreateHybrid(
       lifestyleSelector:() => HttpContext.Current != null, 
       trueLifestyle: new WebRequestLifestyle(), 
       falseLifestyle: new LifetimeScopeLifestyle()); 

      container.Register<IEventDataController, EventDataController>(Lifestyle.Singleton); 
      container.Register<IHub, EventDataHub>(hybridLifestyle); 

      container.Verify(); 

      var activator = new SimpleInjectorHubActivator(container); 
      GlobalHost.DependencyResolver.Register(typeof(IHubActivator),() => activator); 

      app.MapSignalR(); 
     } 
    } 

ハブベーター

public class SimpleInjectorHubActivator : IHubActivator 
    { 
     private readonly Container _container; 

     public SimpleInjectorHubActivator(Container container) 
     { 
      _container = container; 
     } 

     public IHub Create(HubDescriptor descriptor) 
     { 
      return (IHub)_container.GetInstance(descriptor.HubType); 
     } 
    } 

Subscribe方法は、クライアント側から到達不可能であると思われます。ハブコンストラクタが実行されます。

例外スタック:

[MissingMethodException:この目的のために定義されていないパラメータのないコンストラクタ]
System.RuntimeTypeHandle.CreateInstance(RuntimeType型、ブール publicOnly、ブールNOCHECK、ブール& canBeCached、 RuntimeMethodHandleInternal & CTOR 、Boolean & bNeedSecurityCheck)+0
System.RuntimeType.CreateInstanceSlow(Boolean publicOnly、Boolean skipCheckThis、Boolean fillCache、Stack CrawlMark & stackMark)113
System.RuntimeType.CreateInstanceDefaultCtor(ブールpublicOnly、 ブールskipCheckThis、ブールfillCache、StackCrawlMark & stackMark) 206 System.Activator.CreateInstance(タイプタイプ、ブール非公開)83 System.Activator.CreateInstance (タイプtype)+11 Microsoft.AspNet.SignalR.Hubs.DefaultHubActivator.Create(HubDescriptor 記述子)+84
Microsoft.AspNet.SignalR.Hubs.DefaultHubManager.ResolveHub(文字列 hubName)+27
Microsoft.AspNet。 SignalR.Hubs.HubDispatcher.CreateHub(IRequest 要求、HubDescriptor記述子、String connectionId、 StateChangeTrackerトラッカー、ブールthrowIfFailedToCreate)+386
Microsoft.AspNet.SignalR.Hubs.HubDispatcher.OnReceived(IRequest 要求は、文字列connectionId、文字列データ)+400
Microsoft.AspNet.SignalR。 <> c__DisplayClass64_1.b__5() +34 Microsoft.AspNet.SignalR.TaskAsyncHelper.FromMethod(Func`1のFUNC)+28
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスク タスク)+92
System.Runtime .CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク)+58
Microsoft.AspNet.SignalR.Transports.d__40.MoveNext() 742 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスク タスク)+92
システム.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク)+58 Microsoft.Owin.Mapping.d_ _0.MoveNext()+385
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスク タスク)+92
System.Runtime.CompilerServices.TaskAwaiter。HandleNonSuccessAndDebuggerNotification(タスク タスク)58
Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.d__5.MoveNext() 187 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスク タスク)92
System.Runtime。 CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク)+58
Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.d__2.MoveNext() 185 Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.StageAsyncResult.End(たIAsyncResult AR) +69
Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.EndFinalWork(IAsyncResult AR)+64
System.Web.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +380 System.Web.HttpApplication.ExecuteStep(IExecutionStepステップ、ブール& completedSynchronously)155

編集:

[ArgumentNullE:

は、Global.asaxのためにStartup.csからDIの設定を移動するには、この例外がスローされますxception:valueをnullにすることはできません。 ParameterNameが: S] System.IO.StringReader..ctor(文字列S)11377176
Microsoft.AspNet.SignalR.Json.JsonSerializerExtensions.Parse(JsonSerializer シリアライザ、文字列JSON)+63
Microsoft.AspNet.SignalR。 Hubs.HubRequestParser.Parse(Stringデータ、 JsonSerializerシリアライザ)+21
Microsoft.AspNet.SignalR.Hubs.HubDispatcher.OnReceived(IRequest 要求は、文字列connectionId、文字列データ)40
Microsoft.AspNet.SignalR。 <> c__DisplayClass64_1.b__5() +34 Microsoft.AspNet.SignalR.TaskAsyncHelper.FromMethod(Func`1のFUNC)+28
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスク タスク)+92
System.Runtime .CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク)+58
Microsoft.AspNet.SignalR.Transports.d__40.MoveNext() 742 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスク タスク)+92
システム.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク)+58 Microsoft.Owin.Mapping.d_ _0.MoveNext()+385
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスク タスク)+92
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク)+58
Microsoft.Owin.Host .SystemWeb.IntegratedPipeline.d__5.MoveNext() 187 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスク タスク)92
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク)58
マイクロソフト.Owin.Host.SystemWeb.IntegratedPipeline.d__2.MoveNext() + 185 Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.StageAsyncResult。エンド(たIAsyncResult AR)69
Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.EndFinalWork(たIAsyncResult AR)65
System.Web.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 380 System.Web.HttpApplication.ExecuteStep(IExecutionStepステップ、ブール& completedSynchronously)155

+0

発生した例外を見つけて、すべてのご提示くださいあなたの質問でこの例外の詳細。 – Steven

+0

SignalRアプリケーションはクラッシュしません。私が含まれている例外スタックは、500応答内にあります。 – gerric

+0

StackTraceから、SignalRがあなたの 'SimpleInjectorHubActivator'の代わりに' DefaultHubActivator'を使用していることが明らかになります。 – Steven

答えて

1

私は最終的に問題を発見:

container.Verify()IHubActivatorの登録を壊しています。だからそれは後で、あるいは決して呼び出されなくてはならない。

さらに、IHubのコンテナ登録が削除されました。このコンテナの登録は、今すぐに動作します。 (container.Register<IEventDataController, EventDataController>(Lifestyle.Singleton)は、その時点で働いていなかったので、私はそれを追加し、それが何らかの形でそれを修正)

だから、Startup.csの私の最終的なコードは次のようになります。

public void Configuration(IAppBuilder app) 
{ 
    var container = new Container(); 

    container.Register<IEventDataController, EventDataController>(Lifestyle.Singleton); 

    var activator = new SimpleInjectorHubActivator(container); 
    GlobalHost.DependencyResolver.Register(typeof(IHubActivator),() => activator); 

    app.MapSignalR(); 
} 
関連する問題