Создайте новую область в основном проекте asp.net, используя autofac - PullRequest
0 голосов
/ 24 мая 2019

Я использую ядро ​​aspnet с autofac.У меня есть два одноэлементных сервиса, которые действуют как кеш (получают данные из базы данных и кешируют их). Мне нужно создать новую область видимости, чтобы dbcontext, объявленный как InstancePerLifeTime, не был разделен между двумя одноэлементными сервисами (каждый сервис должен иметь свойсобственный dbcontext) Как мне получить IContainer в ядре asp.net?Я попытался вызвать containerBuild.Build();, и я получаю сообщение об ошибке того контейнера, который уже был создан системой.

Ответы [ 3 ]

0 голосов
/ 24 мая 2019

Вы можете разрешить ILifetimeScope из конструктора и вызвать его BeginLifetimeScope метод.

0 голосов
/ 24 мая 2019

Это не то, как работают пожизненные области видимости.

Если вы зарегистрируете что-то как одноэлементное (SingleInstance), оно будет разрешено из корневой области времени жизни, а не дочерней области. Его зависимости _ также будут разрешены из корневой области (контейнера), а не дочерней области.

Это подробно рассмотрено в теме документации 'Зависимости в неволе'.

По сути, у вас не может быть синглтона, который принимает зависимость объема экземпляра на запрос или дочернюю область жизни. У вас может быть синглтон, который принимает экземпляр-на-зависимость (который будет разрешен только один раз - из контейнера, а не дочерней области - и затем будет удерживаться); или у вас может быть одноэлементный объект, который принимает компонент «экземпляр на всю жизнь», а используемая область действия будет корневым контейнером, эффективно создавая один объект из всего, что вы потребляете.

Тем не менее, вопрос, который вы действительно задаете: «Как получить контейнер в ASP.NET Core», и ответ на этот вопрос также есть в документации, в ASP.NET Core, «Быстрый старт» ( Без ConfigureContainer) "раздел.

  • Переключите метод ConfigureServices для возврата IServiceProvider вместо void
  • Создайте контейнер самостоятельно и сохраните ссылку на него по своему выбору.
  • Возврат new AutofacServiceProvider(container) в конце ConfigureSerivces.

В документах приведен полный пример кода.

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

0 голосов
/ 24 мая 2019

Я думаю, вам не нужен новый прицел.Насколько я знаю, лучшая практика для dbcontext составляет dbcontext-per-business operation.В случае веб-приложения это веб-запрос.

В вашем случае вы можете передать IDbContextFactory (синглтон тоже) в эти синглтоны и создать новый экземпляр DbContext, когда вам это нужно.

...