2011-01-13 21 views
1

によって誘致http://huyrua.wordpress.com/2010/08/25/specification-pattern-in-entity-framework-4-revisited私はすべての重要でない質問を仕様書に書くことに決めました。 は、しかし、私はいくつかの関数で1つの仕様を使用する方法を知ってはいけない問題が発生したу:リポジトリの仕様パターン?

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(); 
} 

が、私は「仕様を抽出したいを=> a.Email.ToUpper()== email.ToUpper() "両方の関数で使用することができますが、私は" email "(関数パラメータ)でパラメータ化する必要があります。これどうやってするの?その後

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

:私はあなたにリンクするページを表示することはできませんが、私はそれがこのような何かを行くだろうと想像何らかの理由

答えて

3

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

私はこの問題を考えますそのコンストラクタでラムダ式をとる汎用のSpecificationクラスを使用しているという事実にあります。私の意見では、仕様の目的はドメインオブジェクトにいくつかの制限を指定することです。したがって、あなたはSpecificationクラスを抽象クラスにし、EmailExistsSpecificationクラスとAccountIdIsNotEqualSpecificationクラスで継承してください。

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

このアプローチは、ジェネリック仕様クラスを使用するよりも明らかに意図していると思います。