存储库的规格模式?

时间:2011-01-13 14:44:05

标签: .net linq domain-driven-design repository specifications

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“(函数参数)对其进行参数化。我怎么能这样做?

2 个答案:

答案 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())
    {
    }
}

我认为这种方法比使用通用规范类更有意图揭示。