首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何使用其他构造函数的参数在类中检索HubContext (SignalR)?

如何使用其他构造函数的参数在类中检索HubContext (SignalR)?
EN

Stack Overflow用户
提问于 2018-10-15 19:22:03
回答 1查看 901关注 0票数 4

我有一个在构造函数中有一些参数的类。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ServerStatus
    {   
       private int idserver;
       private string des;
       private string ipserver;

       private int attemptfailded = 0;

        public ServerStatus(int id, string description, string ip)
        {
            this.idserver = id;
            this.des = description;
            this.ipserver = ip;    
        }

       ... /* Other logic of this class: like notification management */

    }

现在,我想在这个类中添加一个如下所示的集线器上下文的实例,并拥有一个使用此集线器上下文的方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ServerStatus
{
   private readonly IHubContext<MyHub, ITypedHubClient> _hubContext;

   private int idserver;
   private string des;
   private string ipserver;

   private int attemptfailded = 0;

    public ServerStatus(IHubContext<MyHub, ITypedHubClient> hubContext, int id, string description, string ip)
    {
        this.idserver = id;
        this.des = description;
        this.ipserver = ip;
        _hubContext = hubContext;

    }

   ...

   public async Task SendMessageToClients()
   {       
        await _hubContext.Clients.All.BroadcastMessage("Server", 
        "ServerDown");
   }

}

特别是,我希望这个类在我想要的任何地方都是可实例化的,比如,如果我有另一个实现这个ServerStatus对象列表的类,我需要从这个类调用构造函数。这是一个示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static class MyClass
{

    public static List<ServerStatus> servers = new List<ServerStatus>();

    public static void initializeServers()
    {
        foreach (/* server I have in a Database */)
        {

            ServerStatus s = new ServerStatus (/* the hub context and the parameters of the server */)

            servers.Add(s);
        }
    }
}

我的问题是:如何将此hubContext添加到我的类中,并在需要它们的地方实例化对象。

请记住,我已经设置了所有的SignalR库,并且可以正常工作,但是现在我不知道如何将hubContext传递给需要它的类。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-16 00:11:24

你的类需要是静态的吗?

当您在ConfigureServices中注册您的类/服务时,它们将注册到.NET核心服务提供者。使用非静态类,您可以注入此接口,并使用它向.NET核心服务提供者请求已注册的服务。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MyClass
{
    private readonly IServiceProvider _provider;

    public MyClass(IServiceProvider provider)
    {
        _provider = provider;
    }

    public void InitializeServers()
    {
        foreach(/* server I have in database */)
        {
            var hub = _provider.GetService<IHubContext<MyHub, ITypedHubClient>>();

            ServerStatus s = new ServerStatus(hub, ...);
        }
    }
}

您可以使用IServiceProvider检索已向其注册的任何服务,包括您的IHubContext。在内部,.NET核心在创建服务时使用服务提供者将服务注入到已注册的服务/控制器等中。在这种情况下,您只需手动执行与其相同的操作即可。

注意:您需要在startup.cs中注册您的MyClass,以便将服务提供者注入到构造函数中。例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
services.AddSingleton<MyClass>();

但是,现在您已经向服务提供商注册了MyClass,您可以直接将依赖项注入到MyClass

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MyClass
{
    private readonly IHubContext<MyHub, ITypedHubClient> _hubContext;

    public MyClass(IHubContext<MyHub, ITypedHubClient> hubContext)
    {
        _hubContext = hubContext;
    }

    public void InitializeServers()
    {
        foreach(/* server I have in database */)
        {
            ServerStatus s = new ServerStatus(_hubContext, ...);
        }
    }
}

如果你想在启动时实例化这个类,你可以在Configure方法中获得一个实例。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    var myClass = app.ApplicationServices.GetService<MyClass>();

    myClass.InitializeServers();

    // the rest of the startup
    ...
}

ApplicationServices是我们前面提到的IServiceProvider接口的一个实现。

Configure方法中的任何地方都可以调用GetService。它不一定要在一开始就进行。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52823437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文