Должен ли ваш класс быть статичным?
Когда вы регистрируете свои классы / сервисы в ConfigureServices
, они регистрируются в .NET Core Service Provider.С помощью нестатических классов вы можете внедрить этот интерфейс и использовать его для запроса зарегистрированных сервисов у основного поставщика услуг .NET, например:
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 использует поставщика услуг для внедрения сервисов в ваши зарегистрированные сервисы / контроллеры и т. Д. При его создании.В этом случае вы просто делаете то же самое, что и он, но вручную.
ПРИМЕЧАНИЕ. Вам нужно будет зарегистрировать MyClass
в startup.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
...
}
ApplicationServices
является реализацией интерфейса IServiceProvider
, о котором мы упоминали ранее.
Вызов GetService
может осуществляться в любом месте метода Configure
.Это не должно идти прямо в начале.