ODATA是否使用Microsoft Web API真正的REST架构?

ODATA是否使用Microsoft Web API真正的REST架构?

问题描述:

我对Microsoft framework on ODATA的研究越多,我倾向于认为它不适合企业应用。该框架期望所有的数据库都直接作为ViewModel公开,即使对于像分页&这样的简单操作也是如此。ODATA是否使用Microsoft Web API真正的REST架构?

我们将*使用高雅的机制来保存呈现给JavaScript客户端的页面编号。

或者我不正确理解微软提供的OData?

编辑-1:

是ODATA V4有状态的架构?由微软 模式团队推广。我没有看到从 Asp.Net Web API(REST)到OData(Sounds STATEFUL)体系结构迁移的任何简单路径。

EDIT-2: 分页,排序&分组是从客户端进入的请求的一部分。

+0

https://*.com/questions/2458407/difference-between-odata-and-rest-web-services –

+2

等等,是不是分页部分客户端发送的请求?除了标题之外,这看起来就像是你的一系列陈述,你真的有问题吗? – Icepickle

+0

@DavidTansey,谢谢答案追溯到2010年。 – Abhijeet

简而言之,MS Odata服务器端的实现是而不是 statefull,它可以被认为是一个REST架构。

我们将*使用stasteful机制坚持呈现给JavaScript客户端

您提供寻呼在请求信息的页码。例如,如果你想10项2页的你会采取前10名,并跳过10

odata-url/?$count=true&$top=10&$skip=10 

正如你可以看到客户端/呼叫方指定分页,没有必要让服务器跟踪状态的客户。

同时加入$count=true将返回基于结果集中包含的传入过滤器的记录总数(在上例中没有过滤器)。这将允许客户计算页面的数量。


框架要求所有的数据库直接暴露视图模型...

也是不正确。您可以返回IQueryable<T>,其中T是您的类型。 T不一定是EF模型。例如,从DbContext返回以下内容是可以接受的。

public IQueryable<SomeEntity> Get() { 
    return dbContext.SomeEntities 
     .Where(x => optionalPreFiltereExpression) 
     .Select(x => new SomeDTO(){ 
      Prop1 = x.Prop1, 
      Collection1 = x.CollectionOfInterest, 
      // etc 
     }); 
} 

为了进一步说明这一点,你也可以返回对象的一个​​硬编码名单,虽然这可能不是在生产中非常有可能。

public IQueryable<SomeEntity> Get() { 
    return new List<SomeDTO>(){ 
     new SomeDTO(){ 
      Prop1 = 5, 
      Prop2 = "Hi there" 
      // etc}, 
     new SomeDTO(){ 
      Prop1 = 6, 
      Prop2 = "Goodbye" 
      // etc} 
     }).AsQueryable(); 
} 

有关于OData的所有选项的资源。我不打算在这里包括所有的东西,否则我可能只是创建第二套文档。

+1

还有一件事要强调它的无状态性质:从第1页到第2页的分页可能导致两次查看记录。当f.i.在从用户页面1到页面2开始页面的时间内,假设记录将是页面1中的第一个页面,页面1的最后一个记录将被推送到页面2,则向数据集添加新记录。 –

+0

@NielsV - 同意,但如果发生这种情况也取决于当前传递的任何过滤器(可能会排除添加的记录)和传递的排序表达式。这个概念适用于大多数任何无状态的程序,记录可能会被改变,甚至被删除,如果它在排序中看起来不同或者被排除/包含在过滤器中,这会改变在分页操作中显示的预期记录。 – Igor

+0

考虑投票当前问题;-) – Abhijeet