2012-05-28 33 views
6

Tôi đang cố gắng triển khai tùy chỉnh MediaTypeFormatter, nhưng phương pháp bool CanReadType(Type type) luôn được gọi với loại IKeyValueModel, thay vì loại của tôi MyProduct.MediaTypeFormatter tùy chỉnh, tại sao IKeyValueModel chứ không phải kiểu mô hình của tôi?

Trong điều khiển API của tôi, tôi có:

[HttpPost] 
public Task Save(MyProduct product) 

Tôi đã thấy một số ví dụ (example 1, example 2), và tôi cũng đã cố gắng mã:

protected override bool CanReadType(Type type) 
{ 
    if (type == typeof(IKeyValueModel)) 
     return false; 
     return true; 
} 

Nhưng sau đó tôi nhận được một " MissingMethodException: Không có hàm tạo tham số nào được định nghĩa cho đối tượng này ", bởi vì kiểu mô hình của tôi không có hàm tạo tham số. Vì vậy, có vẻ như vì CanReadType trả về false thành IKeyValueModel, khung sử dụng trình định dạng loại phương tiện khác. Trên thực tế, phương pháp OnReadFromStreamAsync không bao giờ bị trúng.

Tôi muốn có thể kiểm soát cách mô hình của mình được deserialized, tôi muốn nhận được loại thực và không IKeyValueModel.

Điều này đã hoạt động tốt trong MVC với trình kết nối mô hình.

Chúc mừng.

CẬP NHẬT 2012/05/29:

Nếu tôi loại bỏ các định dạng json mặc định nó hoạt động:

public static void RegisterApis(HttpConfiguration config) 
    { 
     config.Formatters.Clear(); 

Nhưng sau đó tôi sẽ muốn giữ cả hai, làm thế nào tôi có thể chỉ ra cái nào tôi muốn sử dụng?

Trân trọng.

+0

Tại sao bạn cần tùy chỉnh 'MediaTypeFormatter'? – Aliostad

+1

Hãy thử mã mới nhất (xây dựng hàng đêm), không có IKeyValueModel trong nguồn hiện tại. Nó đã bị xóa/xóa bởi nhóm. http://aspnetwebstack.codeplex.com/SourceControl/network/forks/BradWilson/AspNetWebStack/changeset/changes/5648aed69341 – user960567

+0

@Aliostad Tôi cần một MediaTypeFormatter tùy chỉnh để kiểm soát cách các đối tượng của tôi được tuần tự hóa và deserialized thành JSON. – vtortola

Trả lời

3

Nếu bạn cần kiểm soát tuần tự hóa, tốt hơn bạn nên sử dụng các tính năng linh hoạt của Json.NET (xem here, herehere) để kiểm soát thay vì viết định dạng kiểu phương tiện.

Json.NET now là trình định dạng mặc định trong ASP.NET Web API.


CẬP NHẬT

Đối tượng của tôi không có nhà thầu parameterless và các thuộc tính là chỉ đọc. Tôi cũng có các đối tượng kế thừa từ DynamicObject, do đó, giả sử rằng các thực thể nghiệp vụ của tôi không nhỏ.

Tôi có thể chỉ cho bạn cách tự chụp chân mình. Nhưng tôi thà giải thích làm thế nào để tránh có những vấn đề này như tôi tin rằng bạn đang có chúng vì có những mô hình chống trong bạn tiếp cận.

Trước hết, những gì bạn đang tìm kiếm không phải là một định dạng phương tiện truyền thông khác. Bạn cần serializer khác hoặc chỉ cần cấu hình serializer của bạn.

Nhưng quan trọng hơn, việc tuần tự hóa các thực thể kinh doanh của bạn trực tiếp với khách hàng không phải là một ý tưởng tuyệt vời. Chúng ta cần các DTO mà ở đây được gọi là các mô hình xem.Các lớp như vậy chỉ là những người nắm giữ trạng thái, không logic, không có phép thuật. Việc tuần tự hóa chúng không phải là vấn đề.

Bạn có thể sử dụng AutoMapper, v.v. để ánh xạ các thực thể của bạn để xem các mô hình mà không tốn thêm chi phí phát triển. Bạn nên luôn bỏ qua các mô hình miền của mình từ lớp trình bày.

+0

Đối tượng của tôi không có các hàm tạo tham số và các thuộc tính là chỉ đọc. Tôi cũng có các đối tượng kế thừa từ DynamicObject, vì vậy hãy nói rằng các thực thể nghiệp vụ của tôi không tầm thường. Tôi thực sự đang sử dụng JSON.NET dưới nắp, nhưng tôi cần phải sử dụng nó theo cách tùy chỉnh – vtortola

+0

@NullOrEmpty Tôi đã cập nhật câu trả lời của mình – Aliostad

+0

cảm ơn cho đầu vào của bạn, nhưng câu hỏi là về một cái gì đó khác.Chúng tôi thực sự tạo DTO khi chúng ta tạo các thực thể JSON, đó là điểm của JSON: Vì vậy, tôi cần một cách để kiểm soát cách các DTO JSON chuyển đổi trong/từ các thực thể kinh doanh của tôi ... Như tôi đã nói, các đối tượng nghiệp vụ của tôi là động lực (System.Dynamic), đây không phải là về ser ialize một đối tượng với tất cả các thuộc tính của nó, đây là về việc tạo một đối tượng truyền tải JSON từ đối tượng kinh doanh động của tôi và ngược lại. – vtortola

Các vấn đề liên quan