2012-05-28 8 views
6

Estoy tratando de hacer una implementación personalizada de un MediaTypeFormatter, pero el método bool CanReadType(Type type) siempre se llama con el tipo IKeyValueModel, en lugar de mi tipo MyProduct.Custom MediaTypeFormatter, ¿por qué IKeyValueModel y no mi tipo de modelo?

En mi controlador de API que tengo:

[HttpPost] 
public Task Save(MyProduct product) 

he visto algunos ejemplos (example 1, example 2), y también he probado el código:

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

Pero cuando me siento un " MissingMethodException: no se definió ningún constructor sin parámetros para este objeto ", porque mi tipo de modelo no tiene constructor sin parámetros. Por lo tanto, parece que CanReadType devuelve false en IKeyValueModel, la infraestructura usa otro formateador de tipos de medios. En realidad, el método OnReadFromStreamAsync nunca se golpea.

Quiero ser capaz de controlar cómo mis modelos se deserializan, quiero obtener el tipo real y no IKeyValueModel.

Esto ya estaba funcionando muy bien en MVC con carpetas modelo.

Saludos.

ACTUALIZACIÓN 2012/05/29:

Si quito el formateador JSON por defecto funciona:

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

Pero entonces yo le gustaría mantener tanto, ¿cómo podría indicar cuál me ¿quiere usar?

Atentamente.

+0

¿Por qué necesita un 'MediaTypeFormatter' personalizado? – Aliostad

+1

Pruebe el último código (compilación nocturna), no hay IKeyValueModel en la fuente actual. Ha sido eliminado/eliminado por el equipo. http://aspnetwebstack.codeplex.com/SourceControl/network/forks/BradWilson/AspNetWebStack/changeset/changes/5648aed69341 – user960567

+0

@Aliostad Necesito un MediaTypeFormatter personalizado para controlar cómo mis objetos se serializan y se deserializan a JSON. – vtortola

Respuesta

3

Si necesita controlar la serialización, es mejor utilizar características de flexibilidad del Json.NET (ver here, here y here) para controlar en lugar de escribir un formateador tipo de medio sólo por eso.

Json.NET now es el formateador predeterminado en ASP.NET Web API.


ACTUALIZACIÓN

Mis objetos no tienen constructores sin parámetros y las propiedades son de sólo lectura. También tengo objetos que heredan de DynamicObject, así que digamos que mis entidades comerciales no son triviales.

Probablemente pueda mostrarle cómo dispararse en el pie. Pero prefiero explicar cómo evitar estos problemas, ya que creo que los tienes, ya que hay antipatrones en tu enfoque.

En primer lugar, lo que está buscando no es otro formateador de tipos de medios. Necesita un serializador diferente o simplemente necesita configurar su serializador.

Pero más importante aún, la serialización de las entidades comerciales directamente al cliente no es una gran idea. Necesitamos DTO que aquí se llaman modelos de vista.Tales clases son solo poseedores del estado, sin lógica, sin magia. Serializarlos no debería ser un problema.

Puede usar AutoMapper, etc. para mapear sus entidades y ver modelos sin costo de desarrollo. Siempre se recomienda abstraer sus modelos de dominio de la capa de presentación.

+0

Mis objetos no tienen constructores sin parámetros y las propiedades son de solo lectura. También tengo objetos que heredan de DynamicObject, así que supongamos que mis entidades comerciales no son triviales. De hecho, estoy usando JSON.NET bajo el capó, pero Necesito usarlo de manera personalizada – vtortola

+0

@NullOrEmpty He actualizado mi respuesta – Aliostad

+0

Gracias por su contribución, pero la pregunta es sobre otra cosa. Estamos creando REALMENTE DTO cuando creamos entidades JSON, ese es el punto de JSON:) Entonces, necesito una forma de controlar cómo esas JSON DTOs se transforman en/desde mis entidades empresariales ... Como ya dije, mis objetos comerciales son dinámicos (System.Dynamic), esto no se trata de ser ialize un objeto con todas sus propiedades, se trata de crear un objeto de transporte JSON desde mi objeto comercial dinámico y viceversa. – vtortola

Cuestiones relacionadas