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

5.4.1 Конвейер промежуточного ПО

Одной из основных возможностей платформенного IDataContext является прогон изменений через конвейер (pipeline) обработки промежуточного ПО (middleware). Это позволяет имитировать работу триггеров на app-сервере. На прямом проходе производятся различные проверки прав и установка значений по умолчанию. На обратном проходе могут вызываться различные алгоритмы.
Для сохранения данных с выполнением бизнес-логики в конвейере используется перегруженный метод SaveChangesAsync из пространства имен - Eos.Platform.Storage.Middleware.
В метод SaveChangesAsync необходимо передать ServiceProvider и MutationContext. MutationContext можно создавать используя MiddlewareHelper.CreateMutationContext из Eos.Delo.Platform.Storage.Helpers. MutationContext для каждого нового захода через pipeline должен быть новым. Не используйте MutationContext как глобальную переменную! 
Для чтения с проверкой прав доступа в конвейере используется один из перегруженных методов FirstOrDefaultAsync, AnyAsync и т.д. из пространства имен - Eos.Platform.Storage.Middleware.
 
Примеры использования:
1)             Добавление:
// Конвейер промежуточного ПО - добавление
using Eos.Platform.Storage.Middleware;
using Eos.Delo.Platform.Storage.Helpers;
using Eos.Delo.Platform.Storage.Model;
using Eos.Delo.Platform.Storage.Extensions;
 
private readonly IDataContext _dataContext;
private readonly IServiceProvider _serviceProvider;
 
public MyClass(IDataContext db, IServiceProvider serviceProvider)
{
    _serviceProvider = serviceProvider;
    _dataContext = db;
 
    public async Task CreateTestAddressAsync(MiddlewareContextBase baseContext)
        {
            Random rnd = new Random(DateTime.UtcNow.Second);
 
            var newAddress = _dataContext.CreateAddress();
            newAddress.IsnRegion = 4057225;
            newAddress.Note = "Тест" + RandomString(rnd, 10);
            newAddress.IsnOwner = 3935;
            newAddress.KindOwner = 109;
 
            var currentUser = baseContext.GetDeloContext().User;
 
            var context = MiddlewareHelper.CreateMutationContext(_dataContext, currentUser, null,
                ExtProtOperationType.Mutation, baseContext.CancellationToken);
 
            _dataContext.SetAddedState(newAddress);
 
            await _dataContext.SaveChangesAsync(_serviceProvider, context);
        }
 
2)             Изменение:
// Конвейер промежуточного ПО - изменение
using Eos.Platform.Storage.Middleware;
using Eos.Delo.Platform.Storage.Helpers;
using Eos.Delo.Platform.Storage.Model;
using Eos.Delo.Platform.Storage.Extensions;
 
private readonly IDataContext _dataContext;
private readonly IServiceProvider _serviceProvider;
 
public MyClass(IDataContext db, IServiceProvider serviceProvider)
{
    _serviceProvider = serviceProvider;
    _dataContext = db;
}
 
public async Task UpdateTestAddressAsync(long isnAddress, MiddlewareContextBase baseContext)
        {
            Random rnd = new Random(DateTime.UtcNow.Second);
 
            var address = await _dataContext.Addresses.Where(b => b.IsnAddress == isnAddress)
                .AsNoTracking()
                .FirstOrDefaultAsync(_serviceProvider, new QueryContext<IAddress>(baseContext));
 
            _dataContext.EnsureTracked(address);
            address.Note = "Тест" + RandomString(rnd, 10);
 
            var currentUser = baseContext.GetDeloContext().User;
 
            var context = MiddlewareHelper.CreateMutationContext(_dataContext, currentUser, null,
                ExtProtOperationType.Mutation, baseContext.CancellationToken);
 
            await _dataContext.SaveChangesAsync(_serviceProvider, context);
        }
 
3)             Удаление:
// Конвейер промежуточного ПО - удаление
using Eos.Platform.Storage.Middleware;
using Eos.Delo.Platform.Storage.Helpers;
using Eos.Delo.Platform.Storage.Model;
using Eos.Delo.Platform.Storage.Extensions;
 
private readonly IDataContext _dataContext;
private readonly IServiceProvider _serviceProvider;
 
public MyClass(IDataContext db, IServiceProvider serviceProvider)
{
    _serviceProvider = serviceProvider;
    _dataContext = db;
}
 
public async Task DeleteTestAddressAsync(long isnAddress, MiddlewareContextBase baseContext)
        {
            var address = await _dataContext.Addresses.Where(b => b.IsnAddress == isnAddress)
                .AsNoTracking()
                .FirstOrDefaultAsync(_serviceProvider, new QueryContext<IAddress>(baseContext));
 
            _dataContext.SetDeletedState(address);
 
            var currentUser = baseContext.GetDeloContext().User;
 
            var context = MiddlewareHelper.CreateMutationContext(_dataContext, currentUser, null,
                ExtProtOperationType.Mutation, baseContext.CancellationToken);
 
            await _dataContext.SaveChangesAsync(_serviceProvider, context);
        }
Онлайн помощь создана в Dr.Explain