2011-01-13 28 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() 「在兩個函數中使用它,但我應該用」email「(函數參數)對它進行參數化。我怎樣才能做到這一點?

回答

3

出於某種原因,我無法查看您鏈接到頁面,但我想它會去是這樣的:

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

然後:

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

我覺得問題在於,您正在使用通用的Specification類,該類在其構造函數中接受了一個lambda表達式。在我看來,規範的目的是爲域對象指定一些限制。因此,我認爲你應該讓你的Specification課程摘要,並在EmailExistsSpecification課程和AccountIdIsNotEqualSpecification課程中繼承課程。它可能看起來像這樣:

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

我認爲這種方法比使用通用規範類更有意圖揭示。