SignalR:如何在 ASP.NET MVC 中使用 IHubContext<THub,T> 接口?
SignalR : How to use IHubContext<THub,T> Interface in ASP.NET MVC?
我一直在尝试在我的 ASP.NET MVC 项目中使用以下方法,其中使用了 Microsoft.AspNet.SignalR
库:
public interface ITypedHubClient
{
Task BroadcastMessage(string name, string message);
}
继承自集线器:
public class ChatHub : Hub<ITypedHubClient>
{
public void Send(string name, string message)
{
Clients.All.BroadcastMessage(name, message);
}
}
将您输入的 hubcontext 注入您的控制器,并使用它:
public class DemoController : Controller
{
IHubContext<ChatHub, ITypedHubClient> _chatHubContext;
public DemoController(IHubContext<ChatHub, ITypedHubClient> chatHubContext)
{
_chatHubContext = chatHubContext;
}
public IEnumerable<string> Get()
{
_chatHubContext.Clients.All.BroadcastMessage("test", "test");
return new string[] { "value1", "value2" };
}
}
但是,Microsoft.AspNet.SignalR
库中没有 IHubContext<THub,T>
Interface,因此我不能使用带有两个参数 (IHubContext<ChatHub, ITypedHubClient> _chatHubContext;
) 的 IHubContext
。所以,我想知道是否可以使用 DI 库或方法。如果是这样,如何解决这个问题?
Microsoft.AspNetCore.SignalR
包含 IHubContext
用于未类型化的集线器
public interface IHubContext<THub> where THub : Hub
{
IHubClients Clients { get; }
IGroupManager Groups { get; }
}
对于类型化的集线器
public interface IHubContext<THub, T> where THub : Hub<T> where T : class
{
IHubClients<T> Clients { get; }
IGroupManager Groups { get; }
}
正如您从声明中看到的那样,THub
参数并未在任何地方使用,实际上它仅用于依赖注入目的。
Microsoft.AspNet.SignalR
依次包含以下 IHubContext
声明
// for untyped hub
public interface IHubContext
{
IHubConnectionContext<dynamic> Clients { get; }
IGroupManager Groups { get; }
}
// for typed hub
public interface IHubContext<T>
{
IHubConnectionContext<T> Clients { get; }
IGroupManager Groups { get; }
}
如您所见,在这种情况下,接口不包含 THub
参数并且不需要它,因为 ASP.NET MVC
没有为 SignalR
内置 DI。对于使用类型化的客户端,在您的情况下使用 IHubContext<T>
就足够了。要使用 DI,你必须 "manually inject" 集线器上下文,正如我所描述的 .
我一直在尝试在我的 ASP.NET MVC 项目中使用以下方法,其中使用了 Microsoft.AspNet.SignalR
库:
public interface ITypedHubClient
{
Task BroadcastMessage(string name, string message);
}
继承自集线器:
public class ChatHub : Hub<ITypedHubClient>
{
public void Send(string name, string message)
{
Clients.All.BroadcastMessage(name, message);
}
}
将您输入的 hubcontext 注入您的控制器,并使用它:
public class DemoController : Controller
{
IHubContext<ChatHub, ITypedHubClient> _chatHubContext;
public DemoController(IHubContext<ChatHub, ITypedHubClient> chatHubContext)
{
_chatHubContext = chatHubContext;
}
public IEnumerable<string> Get()
{
_chatHubContext.Clients.All.BroadcastMessage("test", "test");
return new string[] { "value1", "value2" };
}
}
但是,Microsoft.AspNet.SignalR
库中没有 IHubContext<THub,T>
Interface,因此我不能使用带有两个参数 (IHubContext<ChatHub, ITypedHubClient> _chatHubContext;
) 的 IHubContext
。所以,我想知道是否可以使用 DI 库或方法。如果是这样,如何解决这个问题?
Microsoft.AspNetCore.SignalR
包含 IHubContext
用于未类型化的集线器
public interface IHubContext<THub> where THub : Hub
{
IHubClients Clients { get; }
IGroupManager Groups { get; }
}
对于类型化的集线器
public interface IHubContext<THub, T> where THub : Hub<T> where T : class
{
IHubClients<T> Clients { get; }
IGroupManager Groups { get; }
}
正如您从声明中看到的那样,THub
参数并未在任何地方使用,实际上它仅用于依赖注入目的。
Microsoft.AspNet.SignalR
依次包含以下 IHubContext
声明
// for untyped hub
public interface IHubContext
{
IHubConnectionContext<dynamic> Clients { get; }
IGroupManager Groups { get; }
}
// for typed hub
public interface IHubContext<T>
{
IHubConnectionContext<T> Clients { get; }
IGroupManager Groups { get; }
}
如您所见,在这种情况下,接口不包含 THub
参数并且不需要它,因为 ASP.NET MVC
没有为 SignalR
内置 DI。对于使用类型化的客户端,在您的情况下使用 IHubContext<T>
就足够了。要使用 DI,你必须 "manually inject" 集线器上下文,正如我所描述的