В нашем приложении есть API, который будет хранить некоторые данные в базе данных. Мы используем Entity Framework Core 3.1.1
. После сохранения этой сущности сообщение отправляется на Azure Servicebus
, и потребитель будет читать это сообщение, сохраняя сообщение в другой таблице в том же DbContext
.
Насколько я понимаю, LifetimeScope
определяется для каждого запроса к API. LifetimeScope
начнется, когда запрос API достигнет ApiController
, и завершится, когда конечная точка обработает запрос.
Проблема, с которой мы сталкиваемся, связана с удалением DbContext
, поэтому она не может Быть использованным в Потребителе согрешило его утилизировать.
Из нашего кода довольно очевидно, почему он не работает. DbContext
регистрируется следующим образом:
containerBuilder.RegisterType<TDbContext>().AsSelf().InstancePerLifetimeScope().As<IDbContext>().IfNotRegistered(typeof(TDbContext));
Мы устанавливаем InstancePerLifetimeScope
при регистрации DbContext
, в результате чего DbContext
удаляется после завершения запроса API и выдает ObjectDisposedException
когда мы пытаемся использовать его в потребителе.
Так же, как эксперимент, я попытался зарегистрировать DbContext
как SingleInstance
следующим образом:
containerBuilder.RegisterType<TDbContext>().AsSelf().SingleInstance().As<IDbContext>().IfNotRegistered(typeof(TDbContext));
Но он по-прежнему выдает исключение ObjectDisposedException, когда мы пытаемся использовать это в Потребителе.
Есть идеи, почему это происходит и как мы можем это решить?
РЕДАКТИРОВАТЬ:
DbContext регистрируется с помощью метода расширения и передается в как дженерик c:
public static class ContainerBuilderExtensions
{
public static void RegisterDbContext<TDbContext>(this ContainerBuilder builder)
{
containerBuilder.RegisterType<TDbContext>().AsSelf().InstancePerLifetimeScope().As<IDbContext>().IfNotRegistered(typeof(TDbContext));
}
}