#c# #asp.net-core #entity-framework-core
#c# #asp.net-core #entity-framework-core
Вопрос:
У меня есть объект для каждой группы пользователей для управления одновременными изменениями в памяти. С фиксированной частотой, скажем, каждые шесть секунд, я беру текущее состояние изменений и применяю его к базе данных. Важная часть заключается в том, что существует отдельный поток, для которого требуется экземпляр dbcontext, находящийся за пределами ASP.NET Жизненный цикл ядра MVC. Это усложняет задачу, или я не знаю, как я могу воспользоваться внедрением непристойности.
Есть ли способ воспользоваться преимуществами AddDbContextPool в этом проблемном пространстве. Похоже, что нет способа арендовать AppDbContext напрямую, и Microsoft предостерегает от создания AppDbContext напрямую, поскольку его API, вероятно, изменится. Насколько я знаю, у меня нет способа внедрить / арендовать контекст моей базы данных в поток, который выполняет работу.
Я передаю поток, используя реактивный API, где я создаю темы и использую примерную конвейерную линию, как показано в примере ниже:
UpdateSubject
.Sample(TimeSpan.FromSeconds(6))
.Subscribe(x => {
// This is where I'd like to take
// advantage of the dbcontext pooling
using(AppDbContext db = new AppDbContext){
// ...
// Iterate Over Changes
// ...
db.SaveChanges();
}
});
Мои текущие предполагаемые варианты таковы.
- Ничего не делайте: архитектура уже консолидирует вызовы.
- Внедрите мой собственный пул и самостоятельно изучите, как сбросить контекст для каждого использования,
- Самостоятельно использовать / внедрять внутренний класс Microsoft DbContextPool, несмотря на предупреждения, он строго предназначен для внутреннего использования, и API может измениться
- Найдите способ отделить его от ASP.NET Жизненный цикл ядра MVC без изменения способа его функционирования, т.Е. найдите способ воспользоваться внедрением зависимостей в моем варианте использования.
- * открыт для предложений
Комментарии:
1. Хороший улов, спасибо. Маркетинг Microsoft может быть … разочаровывающим. Похоже, они просто называют это ASP.NET core MVC. Обзор ASP.NET Core MVC
Ответ №1:
Вопрос помог мне ответить на мой собственный вопрос или найти решение. Все, что приведено ниже, было протестировано с потоками, выполняемыми вне запроса.
Оказывается, мы можем внедрить поставщика услуг для создания наших собственных экземпляров через API!
ReadOnly IServiceProvider _ServiceProvider;
MySingulation(IServiceProvider serviceProvider)
{
_ServiceProvider = serviceProvider;
}
Как только у нас будет дескриптор IServiceProvider посредством внедрения, мы сможем использовать MVC Core API для создания экземпляров нашего контекста
using(var serviceScope = _ServiceProvider.CreateScope())
{
// Don't get confused -- Call GetService from the serviceScope and
// not directly from the member variable _ServiceProvider.
var context = serviceScope.ServiceProvider.GetService<YourAppDbContext>();
// ...
// Make use of the dbcontext
// ...
}
Теперь просто важно помнить, что для начала мы используем пул ядер MVC в Startup.cs.
public void ConfigureServices(IServiceCollection services)
{
//...
services.AddDbContextPool<YourAppDbContext>(options => {
options.UseSqlServer(settings.Connection);
});
// Oh, it's important the singultion was created within Core's LifeCycle/API
services.AddSingleton<MySingulation>();
//...
}