170 похожих чатов

Привет. Ребята, архитектурный вопрос. Есть WebApi на dotnetcore. Используется DI

Container Autofac для резолва всего. Есть сервисы, подключающиеся к БД и делающие то-то. DbContext для подключения запрашивается внутри каждого сервиса через обычный вызов ILifetimeScope.Resolve<DbContext>()

Чаще всего нужно чтобы каждый сервис получал свой экземпляр DbContext и это правильно. Но в некоторых местах, где Service1 использует какие-то методы Service2, и нужно вот как-то сделать чтобы Service2 при инициализации получал тот же самый экземпляр DbContext, что и в Service1. Так как они вместе делают общую логику и она должна происходить на одном и том же контексте.
Как лучше всего это сделать в Autofac?

Да, можно написать какой-нибудь класс-резолвер с логикой, но мне хотелось бы обойтись без кастомных классов, а сделать так, чтобы резолвы из лайфтайма давали тот же инстанс в этих случаях
ILifetimeScope.Resolve<DbContext>()

Подтытоживая. В 90% случаев надо чтобы каждый сервис получал свой экземпляр DbContext, но в 10% случаев надо управлять запрашиванием контекста в Service2 из Service1, подсовывая тому готовый экземпляр контекста, т.е. внутри Service2 мы делаем сколько угодно раз
ILifetimeScope.Resolve<DbContext>()
ILifetimeScope.Resolve<DbContext>()
ILifetimeScope.Resolve<DbContext>()
и каждый раз должны получать один и тот же экземпляр контекста, заданный из Service1. Надеюсь понятно объяснил)

5 ответов

12 просмотров

не скажу за autofaq, но в стандартном DI в asp.net core можно определить один из трех скоупов при регистрации: transient, scoped и singleton. Если я правильно понял, Вам нужен scoped - который резолвит один инстанс в рамках одного http-запроса, но разные - при обработке последующих

Dmitry-B. Автор вопроса
Andrey
не скажу за autofaq, но в стандартном DI в asp.net...

скоупы не подходят, потому что у меня DbContext зареган как Transient, и это правильно. Но в некоторых случаях его как-то нужно сделать Singleton, причём только между двумя сервисами.

var builder = new ContainerBuilder(); builder.RegisterType<Worker>().InstancePerRequest(); https://autofaccn.readthedocs.io/en/latest/lifetime/instance-scope.html#instance-per-request возможно как-то так

Dmitry-B. Автор вопроса
Andrey
var builder = new ContainerBuilder(); builder.Regi...

Это решает проблему в 10% случаев, но в 90% мне по-прежнему нужен новый экземпляр на каждый запрос

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта