СЭД «ДЕЛО»
Руководство пользователя
×

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;
            });
      }
}
Онлайн помощь создана в Dr.Explain