6.3.4 Соединение с базой данных
Для соединения с базой данных, а также работы с другими сервисами, необходимо получить ServiceProvider через создание ServiceScope, который необходимо ииспользовать через using или закрывать явным Dispose(). ServiceScope, ServiceProvider, IDataContext нельзя хранить в свойствах/полях долгоживущих классов, удерживая соединение с БД.
Для работы с ServiceProvider, IDataContext через классы, наследующие базовые диспетчеры, используется метод InContext(Action<IDataContext, IServiceProvider> action) или InContext(Action<IDataContext> action), если не требуется доступ к ServiceProvider.
Для того, чтобы запустить запрос через Middleware, необходимо получить новый экземпляр MiddlewareContextBase. Для этого нужен ClaimsPrincipal, который можно сделать на основании UserID. Также небходимо получить текущего пользователя через UserCachingService и сформировать новый DeloContext.
Если в методе Main необходимо использовать асинхронные методы, его можно переопределить с модификатором async, при этом дожидаться завершения выполнения вложенных вызываемых асинхронных методов через await (например, var user = await userService.GetUserAsync(userId)), либо использовать синхронный метод Main и при вызове асинхронных методов использовать свойство .Result (var user = userService.GetUserAsync(userId).Result) или метод Wait();.
Ниже приведен пример кода соединения с базой данных:
|
// Соединение с базой данных[Daemon("Тестовая группа", "Тестовая ФЗ", "Описание ФЗ", 1.0, DaemonKind.MANUAL, DaemonTypeConfig.AUTO_CONFIG)]public class TestDispatcher : BaseDispatcher
{
protected override void FillParams()
{
//Получение параметров если установлен DaemonTypeConfig.USER_CONFIG
}
protected override void WorkProcess()
{
InContext((db, serviceProvider) =>
{
var userId = DaemonsDomain.Instance.LoadDomainConfiguration().UserID;
var userService = serviceProvider.GetRequiredService<UserCachingService>();
var user = userService.GetUserAsync(userId).Result;
//Запуск обычного запроса
var docRc = db.DocRcs.Where(p => p.IsnDoc == 1)
.AsNoTracking()
.FirstOrDefault();
//Запуск запроса через Middleware
var queryContext = MiddlewareHelper.CreateQueryContext(db, user);
var docRc2 = db.DocRcs.Where(p => p.IsnDoc == 1)
.AsNoTracking()
.FirstOrDefaultAsync(serviceProvider, new QueryContext<IDocRc>(queryContext)).Result;
});
}
}
|
