Создать фабрику областей в ядре asp.net - PullRequest
1 голос
/ 27 марта 2019

Я хочу создать контейнер с областью видимости в ядре asp.net и использовать его в двух методах моего метода синглтона.

Я пытался создать это в каждом методе сиглета.это работает, но я думаю, что это накладные расходы.

        var scopeFactory = _serviceProvider.GetService<IServiceScopeFactory>();
        var scope = scopeFactory.CreateScope();
        var scopedContainer = scope.ServiceProvider;

Я пишу это в каждом методе, когда мне это нужно.Я думаю, что это логическая ошибка.Пожалуйста, объясните мне, как это сделать правильно?спасибо

1 Ответ

7 голосов
/ 27 марта 2019

Технически это не так, как вы это делаете.Если вы работаете в одноэлементном сервисе и вам нужен доступ к сервисам с определенной областью, то должен создать новую область обслуживания и получить службы у поставщика услуг этой области.И когда вы закончите, вы также должны ликвидировать область действия .

На практике вы можете немного упростить это.Вам не следует вводить 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();
        }
    }
}

Как видите, на самом деле не так много для этого.Но, конечно, это заставляет вас дважды задуматься о том, хотите ли вы использовать сервис с определенными областями в пределах одного пакета или нет.

...