Насколько я понимаю, время жизни DbContext через DI по умолчанию - Scoped, и рекомендуется, чтобы DI и инфраструктура управляли временем жизни вместо использования using
операторов.
Это не совсем точно, DI - это метод создания объектов, но вы все равно можете контролировать область действия объектов ... например, используя Ninject ( больше информации ):
// this would create a new MyType instance on every request
kernel.Bind<IMyType>().To<MyType>().InTransientScope();
// this would share MyType instance within the same Thread
kernel.Bind<IMyType>().To<MyType>().InThreadScope();
// this would share MyType instance within the same Web Request
kernel.Bind<IMyType>().To<MyType>().InRequestScope();
Относительно области применения DbContext см. Рекомендация Microsoft :
DataContext является легковесным и недорогим в создании.Типичное приложение LINQ to SQL создает экземпляры DataContext в области действия метода или в качестве члена недолговечных классов, представляющих логический набор связанных операций с базой данных.
Так что, как правило, рекомендуется делитьсятот же экземпляр DbContext
в том же методе ... здесь исключение - логирование .Не стоит смешивать логгер DbContext
с операциями, которые он регистрирует.Ведение журнала должно быть независимым от этих операций ... многие предпочитают регистрировать свое сообщение в текстовом файле, электронной почте, БД ... если вы хотите использовать БД для ведения журнала, вы можете рассмотреть возможность использования другой БД для вашего сообщения журнала.Также рассмотрите возможность использования каркасов журналирования, таких как Serilog , NLog и т. Д.