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 ответов

4 просмотра

не скажу за 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% мне по-прежнему нужен новый экземпляр на каждый запрос

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

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

А чем вам питонисты не угодили?😂
.
79
Язык Си можно выучить за день? По книжке ANSI C на 230 страниц
Vincent Vegan
29
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
75
Dim Dim, [02.07.2024 11:07] DB 0x62 Dim Dim, [02.07.2024 11:07] DB 0x66 Dim Dim, [02.07.2024 11:07] кто пояснит что это?
Dim Dim
14
Ошибка: segmentation fault (core dumped) Код: pastebin.com/BEsNNSSV Сообщение от компилятора: отсутствует ОС: Arch Linux Ядро: x86_64 Linux 6.9.7-arch1-1 Процессор: Intel Cele...
sec
4
Ребят, а за скок можно впарить анон чат с апишкой и веб админкой ?
Eugene Неелов
15
Добрый день, чат. Мне в очередь из других RabbitMQ по shovel валятся метрики в формате текста для Prometheus. Помогите пожалуйста подружить RabbitMQ и Prometheus, чтобы он (...
Aleksey
4
@ahndmn @ayaw0_0 здарова, на чем пишете?
Aiwan \ (•◡•) / _bot
7
Кстати, я тут еще с одной темой столкнулся, вот учу я C++, на таком то ресурсе, а остальные постоянно советуют практиковаться, что то писать, проекты, но как писать если вот т...
aaswq1
7
Ещё такой вопрос. Мне необходимо хранить пароль пользователя локально. Для этого планирую использовать ini файл. Это для автозаполнения полей логин и пароль при авторизации. Е...
Евгений
19
Карта сайта