1

AsyncCrudAppServiceAppServices でABP を使用しています。これが私のインターフェースです:

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()Navigation プロパティのサブプロパティを含む、より詳細な DTO が必要です。ただしGetAll()、テーブルにデータを入力するためだけに、あまり詳細でないものを用意する必要があります。

何らかの方法で戻り値の型をオーバーライドする方法はありますか?

4

2 に答える 2

1

とにかく、最終的にはより複雑なフィルタリング方法が必要になることに気付きました。そこで、カスタムの型とメソッドを作成しました。

まず、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にあるため、これらの注釈は利用できません。

今、私はこれを答えとしてマークしていますが、もっとエレガントな方法があれば、喜んで見て、マークを変更します。

于 2018-08-20T12:49:04.630 に答える