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. Надеюсь понятно объяснил)
не скажу за autofaq, но в стандартном DI в asp.net core можно определить один из трех скоупов при регистрации: transient, scoped и singleton. Если я правильно понял, Вам нужен scoped - который резолвит один инстанс в рамках одного http-запроса, но разные - при обработке последующих
скоупы не подходят, потому что у меня DbContext зареган как Transient, и это правильно. Но в некоторых случаях его как-то нужно сделать Singleton, причём только между двумя сервисами.
var builder = new ContainerBuilder(); builder.RegisterType<Worker>().InstancePerRequest(); https://autofaccn.readthedocs.io/en/latest/lifetime/instance-scope.html#instance-per-request возможно как-то так
Это решает проблему в 10% случаев, но в 90% мне по-прежнему нужен новый экземпляр на каждый запрос
а через Instance Per Owned пробовали?
Обсуждают сегодня