如何在具有其他构造函数参数的类内检索HubContext(SignalR)?

布赖恩

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

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 */

    }

现在,我想在此类中添加一个像这样的中心上下文的实例,并有一个使用该中心上下文的方法。

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对象列表的类,则需要从该类中调用构造函数。这是一个例子:

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给需要它的类。

简·吉德

您的课程是否需要是静态的?

当您在其中注册类/服务时,ConfigureServices它们将注册到.NET Core Service Provider。使用非静态类,您可以注入此接口并将其用于向.NET Core Service Provider请求注册的服务,例如

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 Core在创建服务时使用服务提供商将服务注入到您注册的服务/控制器等中。在这种情况下,您只是在做与手动相同的操作。

注意:您将需要注册您MyClassstartup.cs服务提供商将被注入的构造。例如:

services.AddSingleton<MyClass>();

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

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方法中获取实例

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    var myClass = app.ApplicationServices.GetService<MyClass>();

    myClass.InitializeServers();

    // the rest of the startup
    ...
}

ApplicationServicesIServiceProvider我们前面提到接口的实现

调用GetService可以在Configure方法中的任何地方进行它不必一开始就正确。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

角:如何在其他类方法中访问构造函数的私有输入参数?

如何在其他类中使用参数化构造函数创建类的对象?

如何测试具有采用其他类对象的构造函数的类?(笑话)

使用参数的构造函数在其他类的构造函数

如何在mockito中模拟具有许多构造函数参数的类?

当类构造函数具有参数时,如何在Java中初始化数组?

如何在工厂方法中初始化具有多个参数构造函数的类

如何在PHP中实例化具有参数化构造函数的.NET类?

类构造函数如何具有相同类的参数?

具有其他构造函数的默认结构构造

如何在构造函数中创建需要其他类的类的bean?

如何在具有其他类的同时切换具有特定类的元素

Kotlin:如何将具有可变参数的函数作为参数传递给其他函数

如何在带有附加参数的其他函数中调用带有参数的函数?

当其超类具有较少参数时,如何为子类构造函数添加更多参数?

如何在PHP中向其他方法提供构造函数参数?

HttpClientFactory:带有其他构造函数参数的HttpClient类型

如何在其他类方法中将类函数用作参数

C ++如何从具有一个参数的派生类构造函数调用具有两个参数的超类构造函数?

如何使用其他构造函数扩展类?

如何在Reactjs中绑定具有参数的构造函数中的函数

如何在python类中的其他函数中定义(变量)的函数内使用变量?

在继承的类中具有参数的最佳实践构造函数

具有构造函数参数的Java类动态

在Java中继承具有构造函数参数的类

具有参数的基类构造函数的继承

具有默认参数的C ++基类构造函数

如何使用Mock.Of <>语法模拟在构造函数中具有参数的类?

如何使类的字段与构造函数中的参数具有相同的类型