Технически это не так, как вы это делаете.Если вы работаете в одноэлементном сервисе и вам нужен доступ к сервисам с определенной областью, то должен создать новую область обслуживания и получить службы у поставщика услуг этой области.И когда вы закончите, вы также должны ликвидировать область действия .
На практике вы можете немного упростить это.Вам не следует вводить IServiceProvider
непосредственно в службу.Вместо этого вы можете просто ввести IServiceScopeFactory
напрямую.А затем вы должны также создать область с помощью оператора using
, чтобы убедиться, что он правильно расположен после использования.
Таким образом, пример одноэлементной службы может выглядеть следующим образом:
public class ExampleSingletonService
{
private readonly IServiceScopeFactory _serviceScopeFactory;
public ExampleSingletonService(IServiceScopeFactory serviceScopeFactory)
{
_serviceScopeFactory = serviceScopeFactory;
}
public async Task DoSomethingAsync()
{
using (var scope = _serviceScopeFactory.CreateScope())
{
var db = scope.ServiceProvider.GetService<MyDbContext>();
db.Add(new Foo());
await db.SaveChangesAsync();
}
}
}
Как видите, на самом деле не так много для этого.Но, конечно, это заставляет вас дважды задуматься о том, хотите ли вы использовать сервис с определенными областями в пределах одного пакета или нет.