Действительно ли OData работает в AspNetCore в Linux?

Я работаю в среде, где вся новая работа выполняется в AspNetCore, и одна из основных причин заключается в том, что мы можем запускать ее на серверах Linux. У нас есть API для доступа к одной из наших баз данных, к которой меня попросили добавить OData. Без проблем.

Эта проблема

У меня есть прекрасный пример, работающий в тестовом проекте, и я переношу его на реальный API в ветке кода, ааааааааа.....что это? Это отсылка к Microsoft.AspNet.

Мой тестовый проект — .NetCore 2.1, и установлены только следующие пакеты NuGet:

  • Microsoft.AspNetCore.App v2.1.1
  • Microsoft.AspNetCore.OData v7.0.1 (пробовал и v7.1.0)
  • Microsoft.AspNetCore.Razor.Design v2.1.2
  • Microsoft.NETCore.App v2.1.0

Этот (усеченный) код отлично работает на моем компьютере для разработки Windows, но я предвижу проблемы, когда мы попытаемся собрать его для развертывания Linux.

Startup.cs — Обратите внимание на первые 2 использования

using Microsoft.AspNet.OData.Builder;
using Microsoft.AspNet.OData.Extensions;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.OData.Edm;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using ODataTest.Models;

namespace ODataTest
{
    public class Startup
    {
        ...
        public void ConfigureServices(IServiceCollection services)
        {
            ...
            services.AddOData();
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            ...
            app.UseMvc(b =>
            {
                b.Filter().Expand();
                b.MapODataServiceRoute("odata", "odata", GetEdmModel());
                b.EnableDependencyInjection();
            });
        }

        private static IEdmModel GetEdmModel()
        {
            ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
            builder.EntitySet<ThingDto>(nameof(ThingDto));
            return builder.GetEdmModel();
        }
    }
}

ThingController.cs — уведомление с использованием № 3

using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNet.OData;
using Microsoft.AspNetCore.Mvc;
using ODataTest.Models;

namespace ODataTest.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ODataController
    {
        private readonly Db _db;
        public ValuesController(Db db)
        {
            this._db = db;
        }

        [HttpGet]
        [EnableQuery]
        public ActionResult<IEnumerable<ProductPricePointMarkdownDto>> Index()
        {
            var things =
                from thing in _db.Things
                select new ThingDto
                {
                    ThingID = thing.ID,
                    StyleID = thing.StyleID,
                    ColourID = thing.ColourID
                };

            return Ok(things);
        }
    }
}

ThingDto.cs — обратите внимание на последнее использование

using System;
using System.ComponentModel.DataAnnotations;
using Microsoft.AspNet.OData.Query;

namespace ODataTest.Models
{
    [Filter("ColourID", Disabled = true)]
    [Filter]
    public class ThingDto
    {
        [Key]
        public int ThingID { get; set; }
        public int StyleID { get; set; }
        public int ColourID { get; set; }
    }
}

Может ли кто-нибудь отвлечь меня от моего нынешнего мнения о том, что OData «работает с Core» — это маркетинг, а на самом деле это не так?

Небольшой комментарий: верните IQueryable<T> вместо IEnumerable<T>, чтобы вы могли выполнять запросы на стороне сервера, а не только в памяти. Возвращая свои DTO как IEnumerable<T>, вы теряете эту возможность.

Ricardo Peres 30.05.2019 12:43
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
85
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, ответ: «Да, это работает». Я не выяснил, является ли это плохим пространством имен или действительно относится к .NET Standard. Мотивация выяснить это исчезла, как только я доказал, что это работает в док-контейнере Linux.

Другие вопросы по теме

Похожие вопросы