受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“(函数参数)对其进行参数化。我怎么能这样做?
答案 0 :(得分: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();
}
答案 1 :(得分:3)
我认为问题在于您使用的是在其构造函数中采用lambda表达式的泛型Specification
类。在我看来,规范的目的是为域对象指定一些限制。因此,我认为您应该使Specification
类成为抽象,并在EmailExistsSpecification
类和AccountIdIsNotEqualSpecification
类中继承它。它可能看起来像这样:
public class EmailExistsSpecification : Specification<Account>
{
public EmailExistsSpecification(string email)
: base(a => a.Email.ToUpper() == email.ToUpper())
{
}
}
我认为这种方法比使用通用规范类更有意图揭示。