Изменение выходного DTO (возвращаемого значения) метода GetAll в AsyncCrudAppService
Я использую ABP AsyncCrudAppService
в моих AppServices. Вот мой интерфейс:
public interface IAssetRequisitionAppService : IAsyncCrudAppService
<AssetRequisitionDto, Guid, GetAllInput, AssetRequisitionDto, AssetRequisitionDto, AssetRequisitionDetailsDto>
{ }
И сервис:
public class AssetRequisitionAppService : AsyncCrudAppService
<AssetRequisition, AssetRequisitionDto, Guid, GetAllInput, AssetRequisitionDto, AssetRequisitionDto, AssetRequisitionDetailsDto>,
IAssetRequisitionAppService
{
public AssetRequisitionAppService(IRepository<AssetRequisition, Guid> repository) : base(repository)
{ }
}
Теперь я считаю, что все эти стандартные методы CRUD будут возвращать тип по умолчанию (который AssetRequisitionDto
в моем случае). Но то, что я хочу сделать, это вернуть другой тип для Get()
а также GetAll()
методы.
Get()
должен иметь гораздо более подробный DTO с подвойством навигационных реквизитов. Но GetAll()
должен быть гораздо менее подробным, чтобы заполнить таблицу.
Есть ли способ переопределить возвращаемые типы каким-либо образом?
2 ответа
Ну, я заметил, что мне все равно понадобятся более сложные методы фильтрации. Итак, я создал свои собственные типы и методы.
Во-первых, я создал свой собственный GetAllInput
происходит от PagedAndSortedResultRequestDto
, Он подходит для большинства моих услуг, так как мне обычно нужно запрашивать данные, относящиеся к сотрудникам и местам:
public class GetAllInput : PagedAndSortedResultRequestDto
{
public long? PersonId { get; set; }
public long? LocationId { get; set; }
public EEmployeeType? EmployeeType { get; set; }
}
После этого я написал GetAll
метод для каждой из моих услуг. Они все возвращают PagedResultDto<>
так что я могу использовать его функциональные возможности на уровне представления. Вот один пример ниже:
//MovableAppService
public PagedResultDto<MovableLineDto> GetAllLinesRelatedToUser(GetAllInput input)
{
Logger.Info("Loading all movables related to current user");
IQueryable<Movable> queryable = null;
if (input.PersonId.HasValue)
{
if (input.EmployeeType == EEmployeeType.Recorder)
{
var recorder = _personRepository.GetAll()
.OfType<Employee>()
.FirstOrDefault(x => x.Id == input.PersonId);
var authorizedStorageIds = recorder.StoragesAuthorized.Select(y => y.Id);
queryable = _repository.GetAll()
.Where(x => authorizedStorageIds.Contains(x.StorageOfOriginId));
}
else if (input.EmployeeType == EEmployeeType.UnitManager)
{
var locationCodes = _locationRepository.GetAll()
.Where(x => x.ManagerInChargeId == input.PersonId)
.Select(x => x.Code);
foreach (var code in locationCodes)
{
queryable = _locationRepository.GetAll()
.Where(x => x.Code.StartsWith(code))
.SelectMany(x => x.AssignmentDocs)
.SelectMany(x => x.Movements)
.OfType<Assignment>()
.Where(x => x.TimeOfReturn == null)
.Select(x => x.Asset)
.OfType<Movable>();
queryable = queryable.Concat(queryable);
}
}
else if (input.TenantIdsOversee.Count() > 0)
{
var overseer = _personRepository.GetAll()
.OfType<Overseer>()
.FirstOrDefault(x => x.Id == input.PersonId);
var overseeingTenantIds = overseer.TenantsOversee.Select(y => y.Id);
queryable = _repository.GetAll()
.Where(x => overseeingTenantIds.Contains((int)x.TenantId));
}
else if (input.EmployeeType == EEmployeeType.Employee)
{
queryable = _personRepository.GetAll()
.OfType<Employee>()
.Where(x => x.Id == input.PersonId)
.SelectMany(x => x.AssignmentDocs)
.SelectMany(x => x.Movements)
.OfType<Assignment>()
.Where(x => x.TimeOfReturn == null)
.Select(x => x.Asset)
.OfType<Movable>();
}
}
var list = queryable.ToList()
.OrderBy(x => x.Category.Definition);
var items = _objectMapper.Map<IReadOnlyList<MovableLineDto>>(list);
return new PagedResultDto<MovableLineDto>(items.Count, items);
}
Кстати, ответ Аарона, вероятно, действителен для проектов ASP.NET Core. Но мой проект в MVC EF6, поэтому эти аннотации для меня недоступны.
Теперь я отмечаю это как ответ, но если есть более изящный способ, я рад видеть, и я изменю свою оценку тогда.
Да, есть какой-то способ.
// using Microsoft.AspNetCore.Mvc;
[ActionName(nameof(GetAll))]
public PagedResultRequestDto MyGetAll(PagedResultRequestDto input)
{
return input;
}
[NonAction]
public override Task<PagedResultDto<UserDto>> GetAll(PagedResultRequestDto input)
{
return base.GetAll(input);
}
Ссылка: https://github.com/aspnetboilerplate/aspnetboilerplate/issues/2859