C# 信号机中的简单喷油器对准问题

C# 信号机中的简单喷油器对准问题,c#,asp.net-mvc,dependency-injection,signalr,dependency-resolver,C#,Asp.net Mvc,Dependency Injection,Signalr,Dependency Resolver,我在我的控制器中设置DI,如下所示,并绑定到寄存器IHubContext,如图所示 控制器: 公共类DemoController:控制器 { 私人语境; 公共DemoController(IHubContext上下文) { this.context=上下文; } } Global.asax: 受保护的无效应用程序\u Start() { RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); FilterConfi

我在我的控制器中设置DI,如下所示,并绑定到寄存器IHubContext,如图所示

控制器:

公共类DemoController:控制器
{
私人语境;
公共DemoController(IHubContext上下文)
{
this.context=上下文;
}
}

Global.asax:

受保护的无效应用程序\u Start()
{
RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
BundleConfig.RegisterBundles(BundleTable.Bundles);
var container=新容器();
container.Options.DefaultScopedLifestyle=新的WebRequestLifestyle();
容器。寄存器(生活方式。范围);
//或
容器。寄存器(生活方式。范围);
//代码省略
}

但在调试应用程序时,遇到“System.ArgumentException:”给定类型IHubContext不是具体类型。请使用其他重载之一注册此类型。参数名称:TImplementation'”错误。那么,如何正确注册IHubContext

由于
ASP.NET MVC
没有为
Signal
集线器上下文内置依赖项注入,因此必须使用
GlobalHost.ConnectionManager
获取上下文实例。有了它,您可以在创建
IHubContext
实例的容器中注册一个依赖项。考虑到你已经输入了hub

public class DemoHub : Hub<ITypedClient>
{
}
注册依赖项,如下所示

container.Register<IHubContext<ITypedClient>>(() =>
{
    return GlobalHost.ConnectionManager.GetHubContext<DemoHub, ITypedClient>();
}, Lifestyle.Scoped);
container.Register(()=>
{
返回GlobalHost.ConnectionManager.GetHubContext();
},生活方式。范围);
控制器应该是这样的

public class DemoController : Controller
{
    private IHubContext<ITypedClient> context;

    public DemoController(IHubContext<ITypedClient> context)
    {
        this.context = context;
    }
}
公共类DemoController:控制器
{
私人语境;
公共DemoController(IHubContext上下文)
{
this.context=上下文;
}
}

由于
ASP.NET MVC
没有为
SignalR
集线器上下文内置依赖项注入,因此必须使用
GlobalHost.ConnectionManager
获取上下文实例。有了它,您可以在创建
IHubContext
实例的容器中注册一个依赖项。考虑到你已经输入了hub

public class DemoHub : Hub<ITypedClient>
{
}
注册依赖项,如下所示

container.Register<IHubContext<ITypedClient>>(() =>
{
    return GlobalHost.ConnectionManager.GetHubContext<DemoHub, ITypedClient>();
}, Lifestyle.Scoped);
container.Register(()=>
{
返回GlobalHost.ConnectionManager.GetHubContext();
},生活方式。范围);
控制器应该是这样的

public class DemoController : Controller
{
    private IHubContext<ITypedClient> context;

    public DemoController(IHubContext<ITypedClient> context)
    {
        this.context = context;
    }
}
公共类DemoController:控制器
{
私人语境;
公共DemoController(IHubContext上下文)
{
this.context=上下文;
}
}


Aspnet的版本?核心,框架?SignalR?@JamieRees.Net Framework 4.8、ASP.Net MVC 5.2.7.0、Microsoft.AspNet.SignalR 2.4.1.0的版本。您必须向容器注册实现,以便在解析时注入它dependents@Nkosi我该怎么做?你能把它作为答案贴出来吗?对不起,我真的不知道,我已经尝试了很多方法来解决这个问题。谢谢…您需要先查看与您使用的版本相匹配的文档。Aspnet的版本?核心,框架?SignalR?@JamieRees.Net Framework 4.8、ASP.Net MVC 5.2.7.0、Microsoft.AspNet.SignalR 2.4.1.0的版本。您必须向容器注册实现,以便在解析时注入它dependents@Nkosi我该怎么做?你能把它作为答案贴出来吗?对不起,我真的不知道,我已经尝试了很多方法来解决这个问题。谢谢…您需要先查看与您使用的版本相匹配的文档。非常感谢你的帮助。实际上,我一开始尝试使用ITypedClient,但由于我使用.NET MVC(而不是.NET Core),我无法使用Microsoft.AspNetCore.signer,必须使用Microsoft.AspNet.signer dll。由于这个原因,我不能像上面提到的那样将ITypedClient传递给控制器。在这个场景中,我不能使用ITypedClient,只能将
IHubContext
传递给控制器。我尝试将此用法的答案作为
容器。注册
返回GlobalHost.ConnectionManager.GetHubContext()
,但遇到以下错误:“无法将类型“Microsoft.AspNet.signal.IHubContext”隐式转换为“Microsoft.AspNet.signal.IHubContext”。存在显式转换(是否缺少转换?)@十六进制我已经更新了我的答案。请注意,您应该将
IHubContext
与客户端接口一起使用,而不是与hub类一起使用!。。非常感谢你的帮助和精彩的解释。。。问题现在解决了,我可以继续完成我的信号器实现:)非常感谢您的帮助。实际上,我一开始尝试使用ITypedClient,但由于我使用.NET MVC(而不是.NET Core),我无法使用Microsoft.AspNetCore.signer,必须使用Microsoft.AspNet.signer dll。由于这个原因,我不能像上面提到的那样将ITypedClient传递给控制器。在这个场景中,我不能使用ITypedClient,只能将
IHubContext
传递给控制器。我尝试将此用法的答案作为
容器。注册
返回GlobalHost.ConnectionManager.GetHubContext()
,但遇到以下错误:“无法将类型“Microsoft.AspNet.signal.IHubContext”隐式转换为“Microsoft.AspNet.signal.IHubContext”。存在显式转换(是否缺少转换?)@十六进制我已经更新了我的答案。请注意,您应该将
IHubContext
与客户端接口一起使用,而不是与hub类一起使用!。。非常感谢你的帮助和精彩的解释。。。现在问题已经解决,我可以继续完成我的信号器实现:)