提前了解“仅仅因为提供了一项功能并不能使其成为一个好主意”的警告“...使用OData是个好主意吗?
从外观上看,OData compliant signatures require you return IQueryable。
例如:
[Queryable]
public IQueryable<MyModel> Get()
{
return _repo.GetAll().AsQueryable();
}
然而,在最近的和不那么最近许多文章描述的IQueryable为:
- Leaky
- 'Causing Heavy Lifting' 例如:允许用户抓取整个桌子
- 安全&结垢问题,因为它查询本身
- 还可引起从延迟执行的问题(因为它的可查询的本质)
我的问题是的allows for heavy modification:
你觉得能力IQueryable和OData超出上述问题?
回答,我希望人们谈论:
- 为什么或者为什么不呢?
- 我应该什么时候使用它?
- 您是否仅在某些WebAPI调用中使用...或者用于所有WebAPI调用?
- 那些不是IEnumarable对象的单个模型呢?
...这样的事情。
背景: 我问,不仅是因为上面列出的项目。但也因为OData作为“行业标准”而不是工具箱中的工具出售给我们。因此,实现这一点将从根本上改变我们的WebAPI调用(我目前工作的地方)的回报。我们必须从我们自己的IResult返回签名(这非常有用)到IQueryable,这似乎有问题(但也可能最终有用)。
IRESULT示例:
至少,我们的退货签名会发生剧烈变化。并且,通过将“C实例”更改为“IQueryable实例”(这是有道理的),我被告知WebAPI调用实现OData无法工作。
public interface IResult<C>
{
[JsonProperty(PropertyName = "hasErrors")]
bool HasErrors { get; }
[JsonProperty(PropertyName = "errors")]
IList<String> Errors { get; }
[JsonProperty(PropertyName = "instance")]
C Instance { get; set; }
}
您的示例不现实。你不应该做一个GetAll()。AsQueryable()! – Hylaean 2013-03-13 17:31:24
@Hylaean了解。很棒的评论。但是,IQueryable延迟执行什么(现在基本上)是一个可配置URL的查询......对吧? – 2013-03-13 17:33:24
是的,但它仍然是API编码员的责任,限制,检查权限,强加一个最大等等......只因为你可以做任何事情,并不意味着你应该这样做。 – Hylaean 2013-03-13 17:36:10