2016-12-25 5 views
1

Мое приложение использует шаблон singleton для экземпляра класса обработчика. Он отвечает за обработку некоторых событий:Как обновить DB в одном экземпляре?

public class MyHandler 
{ 
    public void HandlerEvent(object sender, EventArgs e) 
    { 
     //want to update DB here 
    } 
} 

Возможно, MyHandler, возможно, потребуется начать взаимодействие с БД. Так я могу это сделать? Существует мое видение:

  1. Просто жестко прикрепить DbContext в качестве одноэлементных в MyHandler. Очевидно, это плохая идея.
  2. Используйте функции ASP.Net Core DI и отправьте DbContext на номер MyHandler, но в качестве примера «по одному запросу». Я думаю, что в моем случае (MyHandler is singleton) это похоже на 1
  3. Пройдите через using оператор, то есть как атомную транзакцию, например. using(var context = new XDbContext()) {...} Что касается меня, это хороший подход, но для реализации DbContext для Entity Framework Core требуется DbContextOptions как аргумент его конструктора. Если я объявляю безпараметрический конструктор для XDbContext, то он выдает исключение.

Любые идеи?

+0

Почему вы не возобновлять экземпляр в каждом запросе? Например, у вас есть свойство «DbContext» в вашем классе «MyHandler», и в нем обновляется ваш экземпляр «XDbContext», вам не нужно беспокоиться о предыдущих экземплярах, так как они будут собраны через GC. – Emad

+0

@Emad в моем случае 'HandlerEvent' обрабатывает сообщения, которые поступают из шины служебной шины, т. Е. Не зависят от http-запросов. – Mergasov

+0

Моя точка зрения по-прежнему действительна, хотя ответ Егорикаса делает то же самое, используя шаблон фабрики. Вы можете создать весь код фабрики в методе get моего свойства DbContext. – Emad

ответ

1

Я видел учебник по ef core (https://docs.microsoft.com/en-us/ef/core/miscellaneous/configuring-dbcontext), и, как я понял, DbContextOptions - это просто объект с параметрами конфигурации внутри него. Если бы у меня была такая же проблема, я бы использовал третий способ (с использованием), но создавал бы помощник для ввода параметров или с использованием фабрики для этого. Я нашел пример завода в учебнике

using Microsoft.EntityFrameworkCore; 
using Microsoft.EntityFrameworkCore.Infrastructure; 

namespace MyProject 
{ 
    public class BloggingContextFactory : IDbContextFactory<BloggingContext> 
    { 
     public BloggingContext Create() 
     { 
      var optionsBuilder = new DbContextOptionsBuilder<BloggingContext>(); 
      optionsBuilder.UseSqlite("Filename=./blog.db"); 

      return new BloggingContext(optionsBuilder.Options); 
     } 
    } 
} 

Пример использования:

public class MyHandler 
{ 
    public void HandlerEvent(object sender, EventArgs e) 
    { 
     // Or make 'Create' method static 
     using(var context = new BloggingContextFactory().Create()) 
     { 
       . . . 
     } 
    } 
} 
+0

Может ли такой подход подорвать основные DB-конфигурации, которые были реализованы в методе OnModelCreating? Или этот конструктор не имеет значения для OnModelCreating-configs? – Mergasov

+0

@Mergasov Как я знаю, новое ядро ​​EF написано так, как ядро ​​ASP.NET. Это означает, что у нас нет web.config и хранения наших свойств в другом файле (например, appsettings.json), поэтому я полагаю, что такой подход может подорвать основные конфигурации БД, но я не уверен. Просмотрите https://docs.microsoft.com/en-us/ef/core/miscellaneous/connection-strings и секцию ASP.NET Core – Egorikas

 Смежные вопросы

  • Нет связанных вопросов^_^