2011-01-13 5 views
1

Inspiré par http://huyrua.wordpress.com/2010/08/25/specification-pattern-in-entity-framework-4-revisited J'ai décidé d'écrire toutes les requêtes non triviales sur les spécifications. Mais у a rencontré un problème que je ne sais pas comment utiliser une spécification dans quelques fonctions:Modèle de spécification pour le référentiel?

public bool CheckAccountEmailExist(string email) 
{ 
    var emailExistSpec = new Specification(a => a.Email.ToUpper() == email.ToUpper()); 
    return _accountRepository.GetBy(emailExistSpec).Any(); 
} 

public bool CheckAccountEmailExist(string email, Guid exceptAccountId) 
{ 
    var emailExistSpec = new Specification(a => a.Email.ToUpper() == email.ToUpper()); 
    var exceptAccountSpec = new Specification(a => a.Id != exceptAccountId); 
    return _accountRepository.GetBy(emailExistSpec.And(exceptAccountSpec)).Any(); 
} 

Je veux extraire la spécification « a => a.Email.ToUpper() == email.ToUpper() "Pour l'utiliser dans les deux fonctions, mais je devrais le paramétrer avec" email "(paramètre de fonction). Comment puis-je faire ceci?

Répondre

3

Pour une raison quelconque, je ne peux pas voir la page que vous établissez un lien, mais je pense que ce serait quelque chose comme ceci:

class EmailSpecification : Specification { 
    public EmailSpecification(string email) : 
     base(a => a.Email.ToUpper() == email.ToUpper()) 
    { 
    } 
} 

Puis:

public bool CheckAccountEmailExist(string email) { 
    var emailExistSpec = new EmailSpecification(email); 
    return _accountRepository.GetBy(emailExistSpec).Any(); 
} 
3

Je pense que le problème réside dans le fait que vous utilisez une classe générique Specification qui prend une expression lambda dans son constructeur. Le but d'une spécification à mon avis est de spécifier une restriction sur un objet de domaine. Par conséquent, je pense que vous devriez faire votre résumé de classe Specification, et en hériter dans une classe EmailExistsSpecification et une classe AccountIdIsNotEqualSpecification. Il pourrait ressembler à ceci:

public class EmailExistsSpecification : Specification<Account> 
{ 
    public EmailExistsSpecification(string email) 
     : base(a => a.Email.ToUpper() == email.ToUpper()) 
    { 
    } 
} 

Je pense que cette approche est plus révélatrice d'intention que d'utiliser une classe de spécification générique.

Questions connexes