2013-03-13 12 views
8

Hiểu trước thời gian báo trước rằng "chỉ vì một khả năng được cung cấp không làm cho nó là một ý tưởng tốt" ...Bạn có sử dụng OData hay không?

Từ ngoại hình của nó, OData compliant signatures require you return IQueryable.

VÍ DỤ:

[Queryable] 
public IQueryable<MyModel> Get() 
{ 
    return _repo.GetAll().AsQueryable(); 
} 

Tuy nhiên, nhiều bài viết trong thời gian qua và không quá gần đây mô tả IQueryable như:

  • Leaky
  • 'Causing Heavy Lifting' dụ : cho phép người dùng lấy toàn bộ bảng (s)
  • Có an ninh & vấn đề nhân rộng vì nó allows for heavy modification của truy vấn bản thân
  • cũng có thể gây ra các vấn đề từ thực hiện chậm (vì chất queryable của nó)

CÂU HỎI TÔI LÀ:
Bạn có cảm thấy khả năng của IQueryable và OData vượt quá các vấn đề trên?

Trong trả lời, tôi mong chờ người ta nói về:

  • Tại sao hoặc tại sao không?
  • Khi nào tôi nên sử dụng?
  • Bạn chỉ sử dụng trong một số cuộc gọi WebAPI ... hay cho tất cả các cuộc gọi WebAPI?
  • Điều gì về các mô hình riêng lẻ không phải là đối tượng IEnumarable?

... những thứ tương tự.

BỐI CẢNH: Tôi yêu cầu không chỉ vì các mục được liệt kê ở trên. Nhưng cũng bởi vì OData đang được bán cho chúng tôi như là một "tiêu chuẩn công nghiệp" hơn là một công cụ trong hộp công cụ của bạn. Vì vậy, việc thực hiện điều này về cơ bản sẽ thay đổi lợi nhuận cho các cuộc gọi WebAPI của chúng tôi (nơi tôi hiện đang làm việc). Chúng tôi sẽ phải đi từ chữ ký trả lại IResult của chúng tôi (rất hữu ích) cho IQueryable mà dường như có vấn đề (nhưng cũng có thể sẽ hữu ích).

VÍ DỤ IRESULT:
Tối thiểu, chữ ký trả lại của chúng tôi sẽ thay đổi đáng kể. Và, tôi đã nói với WebAPI gọi triển khai OData sẽ không hoạt động bằng cách thay đổi "C Instance" thành "IQueryable Instance" (có ý nghĩa).

public interface IResult<C> 
{ 
    [JsonProperty(PropertyName = "hasErrors")] 
    bool HasErrors { get; } 

    [JsonProperty(PropertyName = "errors")] 
    IList<String> Errors { get; } 

    [JsonProperty(PropertyName = "instance")] 
    C Instance { get; set; } 
} 
+0

Mẫu của bạn không thực tế. Bạn không nên làm một GetAll(). AsQueryable()! – Hylaean

+0

@Hylaean Đã hiểu. Bình luận tuyệt vời. Tuy nhiên, IQueryable được hoãn lại thực hiện những gì là (bây giờ về cơ bản) một truy vấn URL cấu hình ... phải không? –

+0

Có, nhưng nó vẫn là trách nhiệm của coder API để hạn chế, kiểm tra các điều khoản, áp đặt tối đa Hãy vv ... Chỉ vì bạn có thể làm bất cứ điều gì, không có nghĩa là bạn nên. – Hylaean

Trả lời

3

Hỗ trợ truy vấn OData bằng API Web không yêu cầu bạn phải có IQueryable<T>. Có một số IQueryable<T> cho phép bạn đến đó nhanh hơn và với mã ít hơn. IQueryable<T> có các trừu tượng bắt buộc để dịch một truy vấn OData đến truy vấn LINQ. Khuôn khổ đã xác định nó và có hỗ trợ phong phú trên nhiều kết thúc khác nhau cho nó như Entityframework, NHibernate, Linq2Objects, RavenDB, Linq2OData vv Vì vậy, chúng tôi quyết định hỗ trợ phong phú cho IQueryable<T> với API web. Đồng ý, IQueryable<T> là một giao diện lớn và hiển thị nhiều hơn những gì cần thiết cho truy vấn OData.Nhưng nó là cái gì đó đến miễn phí :).

Điều đó nói rằng, chúng tôi có hỗ trợ tốt qua ODataQueryOptions<T> đối với trường hợp không thể truy xuất được. Hãy xem bài đăng trên blog của tôi về số này here

Ngoài ra, bạn đang nhầm lẫn ngữ nghĩa truy vấn OData với OData. Hỗ trợ truy vấn phong phú chỉ là một phần của OData. OData xây dựng trên đầu trang của HTTP và có nhiều tính năng hữu ích khác nhau như

  • Một ứng dụng tốt được suy nghĩ về cả thực tiễn tốt nhất REST và HTTP.
  • Biểu thị Unambiguos về tài nguyên của bạn trong json và xml.
  • $ siêu dữ liệu.
  • Cách tiêu chuẩn mô tả mối quan hệ.
  • Truy vấn phong phú hỗ trợ phép chiếu, lọc, phân trang theo hướng khách hàng và phân trang hướng máy chủ (liên kết trang tiếp theo).
  • Big ecosystem.