【问题标题】:How to Implement Minimal Controller如何实现最小控制器
【发布时间】:2018-02-24 19:11:40
【问题描述】:

我有一个 ASP.NET Core 1.1 Web 项目。

我已经安装了Microsoft.OData.Core,并在http://odata.github.io/ 下点击了链接的“Getting Started”。

该页面上的以下两个链接均适用于 .Net 45

这个月前的 SO answer 链接到 Microsoft.AspNetCore.OData,它不属于 Microsoft,最后一次更新是一年多前。

SO answer 暗示“ASP.net 核心中的 OData 支持”

我看到这个第三方解决方案 AutoODataEF.Core 可以自动生成控制器。

最后,我看到git issue 表明 OData WebAPI for ASP.Net Core 即将推出,但最终目前不可用。

假设我有一个 Person 模型和一个 EF DbContext。

如何实现最小的 OData 控制器?

【问题讨论】:

    标签: asp.net-core .net-core odata restier


    【解决方案1】:

    asp.net core netcoreapp2.0, 20180216 上的odata

    1. 安装包 Microsoft.AspNetCore.OData -Pre {7.0.0-beta1}

    2. 在 Startup.cs 中:

      public virtual void ConfigureServices(IServiceCollection services)
      {
          // ...
          services.AddMvc(); // mvc first
          services.AddOData(); // odata second
      }
      
      public virtual void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
      {
          // ...
          var builder = new ODataConventionModelBuilder(serviceProvider);
          builder.EntitySet<SomeClass>(nameof(SomeClass).ToLower()).EntityType.HasKey(s => s.SomeId);        
          builder.EntitySet<OtherClass>(nameof(OtherClass).ToLower()).EntityType.HasKey(s => s.OtherId).MediaType();   // etc
          var model = builder.GetEdmModel();
      
          app.UseMvc(routeBuilder =>
          {            
              routeBuilder.Select().Expand().Filter().OrderBy().MaxTop(null).Count();
              routeBuilder.MapODataServiceRoute("ODataRoute", "data", model); // e.g. http://localhost:port/data/someclass?...
              // insert special bits for e.g. custom MLE here
              routeBuilder.EnableDependencyInjection();
              routeBuilder.MapRoute(name: "default", template: "{controller=Home}/{action=Index}/{id?}"); // enable mvc controllers
          });    
      }
      
    3. 在 SomeClassController.cs 中:

      public class SomeClassController : ODataController // or just plain Controller
      {
          [EnableQuery]
          [HttpGet]
          [ODataRoute("someclass")]
          public List<SomeClass> Get() // this should maybe be an IQueryable wrapped by an IActionResult/OkObjectResult
          {
              List<SomeClass> list = new List<SomeClass>();
              // however you do this
              return list;
          }
      }
      

    【讨论】:

      猜你喜欢
      • 2012-08-12
      • 2014-10-28
      • 1970-01-01
      • 1970-01-01
      • 2011-08-13
      • 2014-08-25
      • 1970-01-01
      • 2019-02-13
      • 2015-11-30
      相关资源
      最近更新 更多