Действительно ли OData работает в AspNetCore в Linux? - PullRequest
1 голос
/ 30 мая 2019

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

Проблема

У меня есть прекрасный пример работы в тестовом проекте, и я перевожу его на настоящий API в ветке кода annnnnnd ..... что это? Это ссылка на 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" - это маркетинг, а на самом деле это не так?

1 Ответ

1 голос
/ 05 июня 2019

Так что ответ "Да, это работает".Я не выяснил, является ли это плохим пространством имен или фактически ссылается на .NET Standard.Мотивация выяснить пошла, как только я доказал, что это работает на Docker-контейнере Linux.

...