Question

Wikipédia indique que le modèle de spécification est où la logique métier peut être recombinée en enchaînant la logique métier ensemble en utilisant la logique booléenne. En ce qui concerne la sélection des objets de filtrage des listes ou des collections, il me semble que dynamique LINQ me permet de faire la même chose. Est-ce que je manque quelque chose? Y at-il d'autres avantages pour le modèle de spécification qui devrait être pris en compte?


Edit:

J'ai trouvé quelques postes qui combinent LINQ et discuter Demandé le motif Spécification:

Linq Caractéristiques du projet

Mise en œuvre du motif de spécification via Linq par Nicloas Blumhardt (de type Autofac)

Quelqu'un at-gone fait cette route et qu'il est devenu compliqué de maintenir?

Était-ce utile?

La solution

dynamique LINQ utilise des expressions de chaîne pour permettre la construction de requête dynamique. Donc, nous ne perdons en fait il y a la sécurité de type. Alors que l'utilisation de modèles wrapper comme le modèle décorateur de celui-ci incarnation étroitement liée, le modèle de cahier des charges, nous permet de maintenir la sécurité de type dans le code. J'explore à l'aide du modèle Décorateur comme emballage de requête afin de réutiliser et de construire dynamiquement des requêtes. Vous pouvez trouver l'article sur le projet de code à: requête LINQ wrappers

Ou vous pouvez consulter mon .

Autres conseils

Je suis un C # et developpeur aime utiliser le modèle de cahier des charges, car il est plus proche de mon domaine d'affaires. De plus, vous n'avez pas surprise avec ce modèle, si une classe de spécification existe, il devrait fonctionner. Avec LINQ, votre fournisseur sous-jacent a peut-être pas mis en œuvre certaines fonctionnalités, et vous ne saurez pas avant l'exécution.

Mais définitivement, le plus grand avantage de la spécification sur LINQ est d'être plus proche de l'entreprise, c'est un mini-DSL. LINQ pour moi est une connexion DSL pour la requête de collection, pas pour le domaine des affaires.

Je ne sais pas vraiment LINQ, mais il me semble qu'un système de requête déclarative en général est liée au modèle de cahier des charges. En particulier, la mise en oeuvre d'un système d'interrogation déclaratif en composant les objets ensemble dans un environnement orienté objet. IIRC qui est semblable à ce que fait LINQ, fournissant une couche de sucre syntaxique.

Que LINQ démode complètement le motif, je ne peux pas dire. Peut-être il y a des cas d'angle qui ne peut pas être exprimé dans LINQ?

LINQ:

var oldMans = Persons.Where(x => x.Sex == SexEnum.Masculine && x.Age > 60).ToList();

Caractéristique:

var oldMans = Persons.Where(x => IsOldManSpecification(x)).ToList();

J'aime utiliser la spécification quand je pense que la règle est suffisamment important pour être explicite dans le code et il n'appartient pas naturellement à l'entité .

Exemple:

public class Customer
{
    //...

    public bool IsAbleToReceiveCredit(decimal creditValue)
    {
        var secureAge = this.Age > 18 && this.Age < 60;
        var personalAssetsGreaterThanCreditValue = this.PersonalAssets.Sum(x => x.Value) > creditValue;

        return secureAge && personalAssetsGreaterThanCreditValue;
    }
}

Est-il de la Customer la responsabilité pour décider s'il est en mesure de recevoir un certain crédit? Une banque demanderait au client s'il peut recevoir un prêt?

Probablement pas.

avec la spécification que vous pouvez supprimer cette logique du Customer (il ne lui appartenait). Vous pouvez créer quelque chose comme IsAbleToReceiveCreditSpecification et y mettre toute logique. Nous pouvons aller plus loin et combiner des spécifications, par exemple:. Vous pouvez créer un SecureAgeSpecification et un AssetsGreaterThanSpecification et les utiliser pour composer la IsAbleToReceiveCreditSpecification

Je ne pense pas que LINQ remplace la spécification. En fait, il améliore le modèle. Il y a quelques implémentations de la spécification qui utilisent LINQ en interne avec IQueriable<T>, avec cela, vous pouvez utiliser la spécification dans vos requêtes ORM au niveau des dépôts / DATAACESS.

scroll top