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

5.5 Сервис DataContextHelperService

Модуль - Eos.Delo.Platform.Storage.Module;
Пространство имен - Eos.Delo.Platform.Storage.Services;
Расширения - Eos.Delo.Platform.Storage.Extensions.
Сервис DataContextHelperService позволяет быстро получить необходимую сущность по первичному, альтернативному ключу, навигационному свойству или по ряду условий, выполнять хранимые процедуры или SQL-код, получать сервисы для реализации бизнес-логики или проверки прав пользователя на РК, РКПД, Резолюции. Также позволяет получать коллекции родительского объекта через этот объект, либо целые таблицы. Кроме того, позволяет получать коллекцию через UserLists.
При получении коллекции, если в родительской сущности уже заполнен список для этой коллекции (неважно, частично или полностью), каждая сущность в списке обновит свои значения на актуальные из БД.
В Extensions содержатся методы определения дубликата записи по определенным параметрам. Также содержатся методы получения определенных коллекций, методы вызова определенных процедур, методы получения коллекций через UserLists, методы получения сущностей и реализации более сложной логики, например GetPareRefLinkAsync получает парную связку через RefLink.
Сервис DataContextHelperService необходимо использовать для получения классов, которые используются для проверки прав и для вспомогательных методов (например добавления исполнителя к РКПД и т. д.). Примеры классов: PrjRcSecurityService, PrjRcHelperService и другие. Полное описание есть в списке методов для DataContextHelperService.
В актуальной версии работа через DataContextHelperService является стандартом работы в системе и при использовании подключаемых модулей.
 
Примеры использования:
 
1)            Получение сущности по первичному ключу:
// Получение сущности по первичному ключу
using Eos.Delo.Platform.Storage.Services;
 
private readonly DataContextHelperService _dch;
 
public MyClass(DataContextHelperService dch)
{
    _dch = dch;
}
 
public async Task SomeMethod(CancellationToken cancellationToken = default)
{
    var prjRc = await _dch.GetEntityByPrimaryKeyAsync<IPrjRc>(1, cancellationToken);
}
 
2)             Получение сущности по ключу:
// Получение сущности по ключу
using Eos.Delo.Platform.Storage.Services;
 
private readonly DataContextHelperService _dch;
 
public MyClass(DataContextHelperService dch)
{
    _dch = dch;
}
 
public async Task SomeMethod(CancellationToken cancellationToken = default)
{
    var department = await _dch.GetEntityByKeyAsync<IDepartment>(nameof(IDepartment.IsnNode), 1, cancellationToken);
}
 
3)             Получение сущности через навигационное свойство:
// Получение сущности через навигационное устройство
using Eos.Delo.Platform.Storage.Services;
using Eos.Delo.Platform.Storage.Extensions;
 
private readonly DataContextHelperService _dch;
 
public MyClass(DataContextHelperService dch)
{
    _dch = dch;
}
 
public async Task SomeMethod(CancellationToken cancellationToken = default)
{
    var department = await _dch.GetEntityByPrimaryKeyAsync<IDepartment>(1, cancellationToken);
    var parentDep = await _dch.GetEntityFromReferenceAsync(department, p => p.ParentNode, cancellationToken);
}
 
4)             Получение коллекции через объект:
// Получение коллекции через объект
using Eos.Delo.Platform.Storage.Services;
 
private readonly DataContextHelperService _dch;
 
public MyClass(DataContextHelperService dch)
{
    _dch = dch;
}
 
public async Task SomeMethod(CancellationToken cancellationToken = default)
{
    var user = await _dch.GetEntityByPrimaryKeyAsync<IUserCl>(1, cancellationToken);
    var userCardList = await _dch.GetCollectionAsync(user, p => p.UserCards, cancellationToken, CacheUse.Normal);
 
    var prjRc = await _dch.GetEntityByPrimaryKeyAsync<IPrjRc>(1, cancellationToken);
    var prjExecs = (await _dch.GetCollectionAsync(prjRc, p => p.PrjExecs, cancellationToken)).Where(p => p.CanManageExec == 1).ToList();
}
Для получения полиморфных коллекций можно использовать "родные" методы DataContextHelperService или готовые методы расширений.
 
Пример получения списка файлов:
// Получение списка файлов
public static async Task<IEnumerable<IRefFile>> GetRefFileListAsync(this DataContextHelperService dbHelper, IKeyedEntity obj, string parentColumnName, long refFileType, CancellationToken cancellationToken = default, CacheUse cacheUse = CacheUse.Normal) =>
            await dbHelper.GetCollectionAsync<IRefFile>(nameof(IRefFile.IsnObject), nameof(IRefFile.Owner), parentColumnName, obj, false, cancellationToken, cacheUse, nameof(IRefFile.RefFileType), refFileType);
 
Все сущности и коллекции через DataContextHelperService загружаются AsNoTracking.
Описание методов приведено в Приложение Р.
 
Пример получения сервисов проверки прав:
// Получение сервисов проверки прав
using Eos.Delo.Platform.Storage.Services;
using Eos.Delo.Platform.Storage.Extensions;
 
private readonly DataContextHelperService _dch;
 
public MyClass(DataContextHelperService dch, IDataContext db)
{
    _dch = dch;
}
 
public async Task SomeMethod(MiddlewareContextBase baseContext)
{
    _dch.Init(baseContext.GetDeloContext().User);
    var userRightsHelperService = _dch. UserRightsHelper();
    var prjRc = await _dch.GetEntityByPrimaryKeyAsync<IPrjRc>(1, cancellationToken);
    var prjRcSecurityService = _dch. PrjRcSecurity(PrjRc);
}
Онлайн помощь создана в Dr.Explain