【问题标题】:Specification pattern for repository?存储库的规范模式?
【发布时间】:2011-01-13 14:44:04
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    由于某种原因,我无法查看您链接到的页面,但我想它会是这样的:

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

    【讨论】:

      【解决方案2】:

      我认为问题在于您使用的是通用 Specification 类,该类在其构造函数中采用 lambda 表达式。在我看来,规范的目的是对域对象指定一些限制。因此,我认为您应该使您的 Specification 类抽象,并在 EmailExistsSpecification 类和 AccountIdIsNotEqualSpecification 类中继承它。它可能看起来像这样:

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

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

      【讨论】:

        猜你喜欢
        • 2011-01-14
        • 1970-01-01
        • 2010-12-02
        • 2016-05-20
        • 1970-01-01
        • 2014-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多