Мое приложение использует шаблон singleton для экземпляра класса обработчика. Он отвечает за обработку некоторых событий:Как обновить DB в одном экземпляре?
public class MyHandler
{
public void HandlerEvent(object sender, EventArgs e)
{
//want to update DB here
}
}
Возможно, MyHandler, возможно, потребуется начать взаимодействие с БД. Так я могу это сделать? Существует мое видение:
- Просто жестко прикрепить
DbContext
в качестве одноэлементных вMyHandler
. Очевидно, это плохая идея. - Используйте функции ASP.Net Core DI и отправьте
DbContext
на номерMyHandler
, но в качестве примера «по одному запросу». Я думаю, что в моем случае (MyHandler
is singleton) это похоже на 1 - Пройдите через
using
оператор, то есть как атомную транзакцию, например.using(var context = new XDbContext()) {...}
Что касается меня, это хороший подход, но для реализации DbContext для Entity Framework Core требуетсяDbContextOptions
как аргумент его конструктора. Если я объявляю безпараметрический конструктор для XDbContext, то он выдает исключение.
Любые идеи?
Почему вы не возобновлять экземпляр в каждом запросе? Например, у вас есть свойство «DbContext» в вашем классе «MyHandler», и в нем обновляется ваш экземпляр «XDbContext», вам не нужно беспокоиться о предыдущих экземплярах, так как они будут собраны через GC. – Emad
@Emad в моем случае 'HandlerEvent' обрабатывает сообщения, которые поступают из шины служебной шины, т. Е. Не зависят от http-запросов. – Mergasov
Моя точка зрения по-прежнему действительна, хотя ответ Егорикаса делает то же самое, используя шаблон фабрики. Вы можете создать весь код фабрики в методе get моего свойства DbContext. – Emad