2014-06-25 2 views
0

J'ai une méthode de commande avec la signature suivanteinterfaces résolutives en WebAPI

[HttpGet] 
[Route("results")] 
public List<IResult> GetResults() 
{ 
    return repo.GetResults(); 
} 

Sans surprise, je reçois une exception .NET JSON JSON disant .NET ne peut pas résoudre iResult à un type de béton. Y a-t-il un moyen de fournir à JSON .NET la classe concrète (Résultat), donc je n'ai pas besoin de changer la singularité de la méthode?

+0

À moins que je ne comprenne mal votre commentaire, cela nécessiterait de changer la signature de la méthode. Je l'ai déjà fait, mais ce que je voudrais faire est de faire une sorte de mapping comme dans un conteneur IoC qui dit "Toujours résoudre IResult to Result". – Brian

+0

Pas que cela aide, juste un lien vers une question similaire (actuellement sans réponse): http://stackoverflow.com/questions/24124176/mvc-web-api-binding-model-to-a-derived-class. – djikay

Répondre

2

Il semble que ce que vous voulez faire n'est pas vraiment l'injection de dépendance, mais que vous voulez contrôler la façon dont les données sont sérialisées. Ceci est entièrement sous votre contrôle à l'aide d'un formateur de type de média personnalisé (http://www.asp.net/web-api/overview/formats-and-model-binding/media-formatters), mais vous devez d'abord supprimer le formateur json par défaut (http://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization#json_media_type_formatter).

Cela peut tout être fait, mais il va rendre les choses plus fragiles et n'est probablement pas la solution que vous voulez. Cela ne fonctionnera pas si le client veut xml (vous pouvez aussi remplacer ce formateur). Mais plus important encore, que se passe-t-il si vous avez deux implémentations de l'Interface enregistrées dans votre conteneur? Cela soulève une autre question, pourquoi utilisez-vous une interface en tant que DTO? Une interface définit généralement une collection de méthodes à mettre en œuvre par un consommateur. Je comprends que les propriétés peuvent également être définies, mais je ne pense pas que ce soit une utilisation prévue des interfaces.

+0

Je suis d'accord avec vous. Je ne voudrais pas supprimer les formateurs par défaut, mais cela pourrait bien être la seule option. La seule raison pour laquelle j'ai utilisé des interfaces au lieu de types concrets est la façon dont les référentiels sont configurés, et cela fonctionne bien pour tester avec des données fictives. Ce n'est pas pertinent pour les contrôleurs cependant. La seule bonne raison d'utiliser les interfaces serait d'éviter de tout convertir en types concrets. – Brian