En ce qui concerne l'écriture d'une application qui exploite à la fois ASP.NET/MVC et WCF, ce n'est pas génial. WebAPI a peut-être amélioré les choses, mais dans un projet que je connais qui utilisait WCF et MVC dans la même application, ils ont fini par maintenir deux ensembles de modèles différents pour représenter les mêmes concepts - un pour le code WCF et un pour le MVC code. Vous pouvez imaginer tous les mappeurs qu'ils ont dû écrire pour traduire les choses entre les deux modèles - il y avait beaucoup de lignes de code qui auraient pu / auraient dû être évitées.
Cela est en partie dû au fait que les objets de demande et de réponse WCF doivent être annotés avec [DataContract] et leurs propriétés avec [DataMember], tandis que MVC ne l'exige pas. Idiomatic MVC, d'autre part, va vouloir ViewModels, qui ont des objectifs différents de WCF DataContracts. Bien sûr, il est possible que l'utilisation de deux ensembles complets d'objets de domaine ait plus à voir avec la loi de Conway de que les conflits WCF et MVC, mais il convient de souligner que WCF et MVC ont des objectifs et des exigences différents en ce qui concerne la sortie et l'entrée.
Personnellement, je suis partisan du développement d'une API back-end simple mais puissante orientée services, en particulier lorsque vous souhaitez plusieurs clients. Je pense que l'arrivée d'excellents cadres JavaScript MVVM et micro-MVC en fait un choix naturel, car l'écriture de code d'application à l'aide de BackboneJS , KnockoutJS et d'autres permet un environnement de développement performant. Vous pouvez ensuite consommer le back-end dans le micro MVC de votre choix pour créer votre application web, ou sur un client mobile, et vos partenaires peuvent également consommer la même API à distance.
Suggestion
WebAPI ou Service Stack peuvent être de bons candidats pour créer votre API principale. Je recommande Service Stack, car je l'utilise depuis quelques mois et je l'ai trouvé comme un excellent remplacement de WCF. J'écris actuellement une série de tutoriels sur la pile de services sur mon blog .
Le groupe qui gère la pile de services a publié un exemple d'application utilisant le cadre pour développer un clone de type StackOverflow qui montre un modèle de développement qui, à mon avis, est particulièrement convaincant. Cela implique un back-end de services basé sur un modèle simple que vous pourriez imaginer être consommé par un site Web MVC, une application mobile ou tout autre chose facilement. Les objectifs de conception de ServiceStack encouragent clairement un modèle qui devrait conduire à moins de couplage entre le client et le serveur. L'idée est d'éviter les API bavardes avec des appels comme GetCustomersInRegionWithSearchTerm(int regionId, string searchTerm)
en faveur de moins de méthodes. Vous pouvez implémenter la même chose dans la pile de services comme ceci:
[Route("/customers", "GET"]
[Route("/customers/search/{SearchTerm}", "GET"]
[Route("/customers/region/{Region}", "GET"]
[Route("/customers/region/{Region}/search/{SearchTerm}", "GET"]
public class Customers
{
public int? RegionId { get; set; }
public string SearchTerm { get; set; }
}
public class CustomersService : Service
{
public object Get(Customers request) {
// handle request
return new CustomersResponse();
}
}
L'avantage, à mes yeux, est qu'au lieu d'avoir votre propagation de la logique métier au - dessus des tas de méthodes distinctes GetCustomersInRegionWithSearchTerm(int regionId, string searchTerm)
, GetCustomersInRegion(int regionId)
, GetCustomersWithSearchTerm(string searchTerm)
,GetCustomers()
, il est en un seul endroit. Cela devrait conduire à un code plus maintenable.
Par coïncidence, Stack Exchange a embauché l' auteur d' origine de Service Stack . Il continue de s'engager activement dans le projet Service Stack.
J'aime particulièrement les files d'attente de messages pour certaines choses - et bien que WCF le permette, WebAPI ne le fait pas. ServiceStack autorise le même service Web à être appelé via MQ. Pour plus d'informations à ce sujet, consultez l'hôte Redis MQ sur: github.com/ServiceStack/ServiceStack/wiki/Messaging-and-redis