MVC - 在没有EF / DB但是Application Service作为数据源的情况下实现OData

时间:2014-01-17 06:32:19

标签: asp.net-mvc entity-framework asp.net-web-api odata

我们有一个WCF应用程序服务层,它充当我们在DB中定义的域模型的DataService。我们正在编写新的REST Web服务,这些服务将在现有的应用程序服务之上运行。计划使用MVC Web API。

我们希望将RESTFul API公开为OData端点。但看起来OData与EnityFramework数据模型和Context紧密结合。

问题是我们不能使用EF dbcontext,因为我们需要通过从后端应用程序服务请求它们然后映射到数据模型来创建对象。

有没有办法在没有DB但是应用程序服务作为数据源的情况下实现OData。

谢谢, 中号

2 个答案:

答案 0 :(得分:0)

看看MSDN article introducing OData,似乎虽然Visual Studio中的脚手架旨在将OData与EF一起使用,但您仍然可以通过从EntitySetController派生来直接创建控制器:

public class PeopleController : EntitySetController<Person, int>
{
    public override IQueryable<Person> Get()
    {
        // return your own non-EF data source
    }
}

只要你能获得IQueryable,你就应该能够击败OData控制器。

答案 1 :(得分:0)

你可以!您需要处理的唯一有问题的操作是get

有两种方法:

  1. 使用ODataQueryOptions。它包含诸如skip,orderby等参数。
  2. 样品

    public class TestController : ODataController
    {
        public IEnumerable<TestModel> Get(ODataQueryOptions<TestModel> options)
        {
            var entities = new List<TestModel>()
            {
                new TestModel { Id = 1 },
                new TestModel { Id = 2 },
                new TestModel { Id = 3 },
                new TestModel { Id = 4 },
                new TestModel { Id = 5 },
                new TestModel { Id = 6 }
            };
    
            //In this example, we use ApplyTo but you can build an adapter to your application service from the options parameter
            return (IEnumerable<TestModel>)options.ApplyTo(entities.AsQueryable());
        }
    }
    
    1. Implement your own IQueryable Provider that will query the application service。我没试过,但我认为没有任何理由不行。