C# 信号机中的简单喷油器对准问题
我在我的控制器中设置DI,如下所示,并绑定到寄存器IHubContext,如图所示 控制器: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
公共类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类一起使用!。。非常感谢你的帮助和精彩的解释。。。现在问题已经解决,我可以继续完成我的信号器实现:)