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);
}
|
