Comme David a souligné dans son commentaire, beaucoup de ce qui est utile sur la spécification peut maintenant être plus succinctement atteint avec les goûts de LINQ.
Au lieu d'un nouveau type de spécification, vous pouvez créer des spécifications arbitraires à la volée: GetCustomers().Where(customer => customer.IsActive && customer.City == "Oakland");
Ce n'est pas un remplacement complet pour la spécification, cependant, pour deux raisons:
- Le tri/filtrage s'effectue dans la classe consommatrice après le renvoi de tous les clients. Si vous travaillez avec autre chose que des objets en mémoire, ceci est sous-optimal (LINQ-to-SQL et autres sont des exceptions car ils compilent et optimisent les requêtes et les exécutent du côté serveur/distant, retournant seulement les résultats désirés).
- Votre API est ouverte à toute requête si vous exposez des collections et laissez la spécification aux requêtes LINQ. Si vous voulez limiter ce que vous pouvez extraire, vous aurez besoin d'un ensemble de spécifications avec lesquelles interroger.
Il n'y a certainement pas besoin de l'utiliser partout, et il est très possible que vous en aurez pas besoin du tout; Je ne connais pas votre domaine ni ce sur quoi vous travaillez.
Je pense que le meilleur conseil n'est pas de regarder pour l'utiliser. Vous verrez quand cela est justifié, le plus probable lorsque vous commencerez à écrire un cours qui ressemble au premier exemple de l'article auquel vous avez lié. Il suffit de le garder dans votre référentiel de schémas mentaux afin de l'avoir si vous en avez besoin; Si vous ne l'utilisez jamais, cela signifie seulement que vous n'en avez pas besoin, et c'est bien.
Le choix de la couche dépend de la nature des spécifications et de l'utilisation. Dans de nombreux cas, ils sont des aides à la prise en charge d'une couche de service, mais dans certains cas ils encapsulent la logique de domaine.
En ce qui concerne les tests unitaires, n'oubliez pas que vos spécifications sont des unités ou contiennent des unités.Ne pas tester une méthode qui accepte une spécification avec toutes les combinaisons de spécifications possibles; testez les spécifications elles-mêmes pour vous assurer qu'elles se comportent comme prévu, et vous pourrez réutiliser les mêmes spécifications en toute confiance dans de nombreuses méthodes et classes.
J'espère que c'est un peu utile.
Cet article a été publié en 2006. Ce modèle est-il vraiment aussi utile maintenant que nous avons des lambdas en C#? –
Je ne vois aucune utilisation/avantage à l'utiliser du tout, jamais. – fearofawhackplanet
http://stackoverflow.com/questions/1454049/is-the-specification-pattern-obsolete-when-you-use-dynamic-linq –