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; }
}
Mẫu của bạn không thực tế. Bạn không nên làm một GetAll(). AsQueryable()! – Hylaean
@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? –
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