2013-06-24 31 views
13

Tôi hỏi nếu có ai biết liệu có thể chuyển sang một Api Web một lớp cụ thể được kế thừa từ một lớp trừu tượng hay không.Bối cảnh mô hình Api liên kết và sự thừa kế đa hình

Ví dụ:

public abstract class A{ 
    A(); 
} 

public class B : A{ 

} 

[POST("api/Request/{a}")] 
public class Request(A a) 
{ 
} 

Hiện nay tôi đã nhìn xung quanh và hầu hết các giải pháp dường như để nói rằng việc sử dụng TypeNameHandling sẽ làm việc.

JsonMediaTypeFormatter jsonFormatter = new JsonMediaTypeFormatter(); 
      jsonFormatter.SerializerSettings.TypeNameHandling = TypeNameHandling.Auto; 

Tuy nhiên, đây không phải là trường hợp đó. Ngoài ra, mô hình của tôi đang được chuyển từ ứng dụng bảng điều khiển sang webapi. Tôi đã đọc rằng tôi có thể deserialize đối tượng json và sau khi cố gắng này một vài lần tôi quyết định này sẽ không hoạt động.

tôi đã nhìn vào việc tạo ra một mô hình khách hàng binder Tuy nhiên, tôi không muốn làm cho ứng dụng của tôi phức tạp hơn mà nó có được. Hiện tại tôi đã kế thừa từ lớp trừu tượng với 3 mô hình nhưng có thể trong tương lai sẽ mở rộng điều này. Như bạn có thể lưu ý, việc thêm các chất kết dính mô hình tùy chỉnh có thể yêu cầu nhiều chất kết dính trừ khi có cách tạo một chất kết dính chung cho tất cả các loại của lớp trừu tượng.

Để mở rộng về vấn đề này trong ứng dụng giao diện điều khiển của tôi, tôi đã khởi tạo lớp b như vậy và sau đó chuyển nó vào ObjectContent trước khi gửi bài để WebAPI tôi

item = B(); 

//serialize and post to web api 
MediaTypeFormatter formatter; 
JsonMediaTypeFormatter jsonFormatter = new JsonMediaTypeFormatter(); 
jsonFormatter.SerializerSettings.TypeNameHandling = TypeNameHandling.Auto; 
formatter = jsonFormatter; 

_content = new ObjectContent<A>(item, formatter); 
var response = _client.PostAsync("api/Request", _content).Result; 

khi hành động WebAPI được gọi là đối tượng là null

+0

Bạn có lẽ có thể có một cái nhìn vào câu trả lời của tôi liên quan đến thừa kế và modelbinding qua ở đây: http://stackoverflow.com/a/15518804/1184056 –

+0

Cũng giống như các vấn đề sau đây trong JSON.NET đã được cố định vào tháng 3 năm nay. Có lẽ hãy thử lấy phiên bản mới nhất của Json.net và xem liệu vấn đề của bạn có còn repros không: http://json.codeplex.com/workitem/23891 –

+2

Tôi đã xem xét kỹ hơn và trả lời câu hỏi của riêng tôi. Bạn không thể vượt qua một lớp trừu tượng qua mô hình ràng buộc vì bạn không thể khởi tạo một lớp trừu tượng. Cách duy nhất xung quanh vấn đề này là làm cho cơ sở không trừu tượng, theo cách này mô hình ràng buộc hoạt động hoàn toàn tốt đẹp. –

Trả lời

0

Như LiamK đã chỉ ra, giải pháp của ông sẽ không làm việc trong WebAPI. WebAPI sử dụng giao diện IModelBinder cho ràng buộc và ModelMetadataProviders sẽ không tồn tại đối với những mô hình.

tôi đã cung cấp một giải pháp cho vấn đề này ở đây;

WebAPI Custom Model binding of complex abstract object

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