ASP.NET Core API oData и модель уровня API - PullRequest
1 голос
/ 29 мая 2019

Мне нужно использовать OData для моих конечных точек API в приложении ASP.NET Core, но все примеры касаются работы непосредственно с классами модели данных.В архитектуре моего приложения у меня есть сервисный уровень, методы этого сервиса возвращают классы DTO и затем сопоставляются с классами представления API.

Мой класс данных (уровень инфраструктуры):

public partial class Carrier : BaseEntity
{
    public string Name { get; set; }
    public string Code { get; set; }
    public string UsDotNumber { get; set; }
    public string McNumber { get; set; }

Мой класс DTO:

public class CarrierBaseDto
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Code { get; set; }
    public string Fein { get; set; }
    public string McNumber { get; set; }

Класс моей презентации (API):

public class CarrierAPI
{
    [JsonProperty(PropertyName = "name")]
    public string Name { get; set; }
    [JsonProperty(PropertyName = "code")]
    public string Code { get; set; }
    [JsonProperty(PropertyName = "fein")]
    public string Fein { get; set; }
    [JsonProperty(PropertyName = "mcNumber")]
    public string McNumber { get; set; }

Мой метод обслуживания:

    public List<CarrierBaseDto> SearchCarriersDto()
    {
        var query = _context.Carriers
            .Where(c => !c.Deleted);

        IQueryable<CarrierBaseDto> queryDto = query.ProjectTo<CarrierBaseDto>(_mapperConfig);
        return queryDto.ToList();
    }

Метод моего контроллера:

    [HttpGet]
    [Route("GetAll")]
    public IActionResult GetAll()
    {
        var carriers = _carrierService.SearchCarriersDto();
        var carriersApi = _mapper.Map<List<CarrierElementAPI>>(carriers);
        return new OkObjectResult(carriersApi);
    }

Я хочу добавить способности использовать $orderBy, $filter, $fields params.Как добавить его в мою текущую архитектуру?

1 Ответ

1 голос
/ 29 мая 2019

Я думаю, что когда они изначально проектировали OData, он не предназначался для использования без DDD, потому что метаданные должны были позволять вам обрабатывать фильтр и т. Д., Что в настоящее время создает некоторые ограничения на его использование.

Есть хакерские обходные пути, но они работают только частично.Самая близкая вещь, которую я могу придумать, это то, что вы можете сделать, это в общем случае взять параметры запроса и применить их, затем использовать automapper для проецирования на ваш запрос,

Единственная проблема - это сопоставления между Entity и DTO в вашем устройстве автоматического поиска.настройка не может быть сложная и должна быть настроена с помощью отображения выражений

public Object[] Get(ODataQueryOptions<ProductDTO> options)
{
    ODataQuerySettings settings = new ODataQuerySettings()
    {
        PageSize = 5
    };

    IQueryable results = options.ApplyTo(_products.AsQueryable().ProjectTo<ProductDTO>(), settings);

    results.ToArray()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...