Шаблон спецификации для хранилища? - PullRequest
1 голос
/ 13 января 2011

Вдохновленный 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 ]

3 голосов
/ 13 января 2011

Я думаю, что проблема заключается в том, что вы используете универсальный класс Specification, который принимает лямбда-выражение в своем конструкторе.Цель спецификации, на мой взгляд, состоит в том, чтобы указать некоторые ограничения на объект домена.Поэтому я думаю, что вы должны сделать свой класс Specification абстрактным и наследовать его от класса EmailExistsSpecification и класса AccountIdIsNotEqualSpecification.Это может выглядеть примерно так:

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

Я думаю, что этот подход более показателен, чем использование универсального класса спецификации.

3 голосов
/ 13 января 2011

По какой-то причине я не могу просмотреть страницу, на которую вы ссылаетесь, но я думаю, что она будет выглядеть примерно так:

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