2016-07-25 72 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 &構造函數,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 (類型類型)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描述符,字符串連接Id, 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

編輯:

移動從Startup.cs的DI配置Global.asax中引發此異常:

[ArgumentNullE xception:值不能爲null。參數名稱: s]的System.IO.StringReader..ctor(字符串或多個)11377176
Microsoft.AspNet.SignalR.Json.JsonSerializerExtensions.Parse(JsonSerializer 串行器,字符串JSON)63
Microsoft.AspNet.SignalR。 Hubs.HubRequestParser.Parse(字符串數據, 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

從堆棧跟蹤中可以清楚地看到SignalR使用它的'DefaultHubActivator'而不是'SimpleInjectorHubActivator'。 – 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(); 
}