シンプルインジェクタを使用してハブにシングルトンコントローラを注入したいとします。シンプルインジェクタを使用して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
発生した例外を見つけて、すべてのご提示くださいあなたの質問でこの例外の詳細。 – Steven
SignalRアプリケーションはクラッシュしません。私が含まれている例外スタックは、500応答内にあります。 – gerric
StackTraceから、SignalRがあなたの 'SimpleInjectorHubActivator'の代わりに' DefaultHubActivator'を使用していることが明らかになります。 – Steven