Включение/выключение фильтра внутри метода по атрибуту
У меня есть CRUD сервис в котором есть довольно много одинакового кода. Он наследуется от абстрактного класса (в нем уже реализуется всё что надо для crud). Почти все методы (тут показал только на примере Update) имеют одинаковую структуру. Как сделать атрибут который бы автоматически включал/выключал мультитенантность для администратора (т.е с Id = null)?
class ContractCrudService : CrudAppService<ContractStatus, ContractStatusDto, Guid, PagedAndSortedResultRequestDto, CreateUpdateContractStatusDto>
{
public override async Task<ContractDto> UpdateAsync(Guid id, CreateUpdateContractDto dto)
{
if(CurrentTenant.Id == null)
{
using (DataFilter.Disable<IMultiTenant>())
{
return await base.UpdateAsync(id, dto);
}
}
return await base.UpdateAsync(id, dto);
}
}
Я попытался сам написать подобный атрибут, но попытка закончилась после переопределения Match т.к нет даже мыслей как подобное сделать
Ответы (1 шт):
Автор решения: aepot
→ Ссылка
Написать метод-обертку можно
private async Task<T> TryDisableMultiTenantAsync<T>(Func<Task<T>> func)
{
if (CurrentTenant.Id is null)
{
using (DataFilter.Disable<IMultiTenant>())
{
return await func();
}
}
return await func();
}
При желании, можно его в базоывй класс утащить.
public override Task<ContractDto> UpdateAsync(Guid id, CreateUpdateContractDto dto)
{
return TryDisableMultiTenantAsync(() => base.UpdateAsync(id, dto));
}
Можно даже немного оптимизировать
private Task<T> TryDisableMultiTenantAsync<T>(Func<Task<T>> func)
{
async Task<T> DisableMultiTenantAsync()
{
using (DataFilter.Disable<IMultiTenant>())
{
return await func();
}
}
return CurrentTenant.Id is null ? DisableMultiTenantAsync() : func();
}
Здесь я выбросил асинхронную машину состояний, если Id != null