C# 使用简单注入器将控制器注入信号器集线器

C# 使用简单注入器将控制器注入信号器集线器,c#,signalr,simple-injector,C#,Signalr,Simple Injector,我想使用Simple Injector将一个单例控制器注入我的集线器 我已经尝试了以下方法,但是现在我得到了状态500的回复 集线器代码: public class EventDataHub : Hub { private static IEventDataController _dataController; public EventDataHub(IEventDataController dataController) {

我想使用Simple Injector将一个单例控制器注入我的集线器

我已经尝试了以下方法,但是现在我得到了状态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();
        }
    }
Subscribe
方法似乎无法从客户端访问。执行集线器构造函数

异常堆栈:

[MissingMethodException:没有为此对象定义无参数构造函数]
System.RuntimeTypeHandle.CreateInstance(RuntimeType类型,布尔值 publicOnly、Boolean noCheck、Boolean&canBeCached、, RuntimeMethodHandleInternal&ctor、Boolean&bNeedSecurityCheck)+0
System.RuntimeType.CreateInstanceSlow(布尔publicOnly,布尔型 skipCheckThis,布尔填充缓存,堆栈爬网标记和堆栈标记)+113
System.RuntimeType.CreateInstanceDefaultCtor(仅限布尔值), 布尔skipCheckThis、布尔填充缓存、堆栈爬网标记和堆栈标记) +206 System.Activator.CreateInstance(类型类型,布尔非公共)+83 System.Activator.CreateInstance(类型)+11 Microsoft.AspNet.signal.Hubs.DefaultHubActivator.Create(HubDescriptor 描述符)+84
Microsoft.AspNet.signal.Hubs.DefaultHubManager.ResolveHub(字符串 hubName)+27
Microsoft.AspNet.signal.Hubs.HubDispatcher.CreateHub(IRequest 请求,描述符描述符,字符串连接ID, StateChangeTracker跟踪器,布尔throwIfFailedToCreate)+386
Microsoft.AspNet.signal.Hubs.HubDispatcher.OnReceived(IRequest 请求,字符串连接ID,字符串数据)+400
Microsoft.AspNet.signal.c__显示类64_1.b__5() +34 Microsoft.AspNet.signal.TaskAsyncHelper.FromMethod(Func`1 Func)+28
System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务 任务)+92
System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)+58
Microsoft.AspNet.signal.Transports.d_u40.MoveNext() +742 System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务 任务)+92
System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)+58 Microsoft.Owin.Mapping.d_u0.MoveNext()+385
System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务 任务)+92
System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)+58
Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.d_u5.MoveNext() +187 System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务 任务)+92
System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)+58
Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.d_u2.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步骤,布尔值&同步完成)+155

编辑:

将DI配置从Startup.cs移动到global.asax会引发以下异常:

[ArgumentNullException:值不能为null。Parametername: s] System.IO.StringReader..ctor(字符串s)+11377176
Microsoft.AspNet.signal.Json.JsonSerializer.Parse(JsonSerializer 序列化程序,字符串json)+63
Microsoft.AspNet.signal.Hubs.HubRequestParser.Parse(字符串数据, JsonSerializer序列化程序)+21
Microsoft.AspNet.signal.Hubs.HubDispatcher.OnReceived(IRequest 请求、字符串连接ID、字符串数据)+40
Microsoft.AspNet.signal.c__显示类64_1.b__5() +34 Microsoft.AspNet.signal.TaskAsyncHelper.FromMethod(Func`1 Func)+28
System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务 任务)+92
System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)+58
Microsoft.AspNet.signal.Transports.d_u40.MoveNext() +742 System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务 任务)+92
System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)+58 Microsoft.Owin.Mapping.d_u0.MoveNext()+385
System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务 任务)+92
System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)+58
Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.d_u5.MoveNext() +187 System.Runtime.CompilerServices.TaskWaiter.ThrowForNonSuccess(任务 任务)+92
System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)+58
Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.d_u2.MoveNext() +185 Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.StageAsyncResult.End(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步骤,布尔值&同步完成)+155


我终于发现了问题:

container.Verify()
正在破坏
iHubaActivator
的注册。因此,它必须被称为要么事后,要么永远

此外,我还删除了
IHub
的容器注册,因为它现在可以正常工作。(我添加它是因为
container.Register(lifesture.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();
}
public void配置(IAppBuilder应用程序)
{
var container=新容器();
容器。登记(生活方式。单身);
var激活器=新的SimpleInjectorHubActiv
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();
}