2011-01-13 2 views
1

http://huyrua.wordpress.com/2010/08/25/specification-pattern-in-entity-framework-4-revisited에 의해 영감을 얻었습니다. 모든 중요한 검색어를 사양을 통해 작성하기로 결정했습니다. 는하지만 몇 가지 기능을 하나 개의 규격을 사용하는 방법을 잘 모릅니다 문제 у가 발생했습니다저장소의 사양 패턴은 무엇입니까?

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 => a.Email.ToUpper() == email.ToUpper() "두 함수에서 모두 사용할 수 있지만"전자 메일 "(함수 매개 변수)으로 매개 변수화해야합니다. 어떻게해야합니까?

답변

3
난 당신이 링크 페이지를 볼 수없는 이유

,하지만 난 그것을 이런 식으로 뭔가 갈 것 상상 : 내가 문제를 생각

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

:

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

다음을 사실 생성자에서 람다 표현식을 사용하는 일반 Specification 클래스를 사용하고 있다는 사실에 있습니다. 내 생각에 사양의 목적은 도메인 개체에 대한 몇 가지 제한을 지정하는 것입니다. 따라서 당신은 Specification 클래스를 abstract 클래스로 만들고 EmailExistsSpecification 클래스와 AccountIdIsNotEqualSpecification 클래스로 상속해야한다고 생각합니다. 다음과 같이 보일 수 있습니다 :

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

이 접근 방식은 제네릭 스펙 클래스를 사용하는 것보다 더 많은 의도가 드러났다고 생각합니다.