linq to nhibernate многократное использование бизнес-логики в запросах - PullRequest
2 голосов
/ 07 сентября 2011

Я работаю над проектом, в котором мы свободно используем nhibernate и выполняем запросы в нашем хранилище для сущностей. Часто мы пишем такие запросы:

(from person in repository.Query<Person>()
where person.Age > 18 
where person.Age < 50
select person).Single();

Очевидно, у нас есть некоторая логика, и мы хотели бы иметь возможность инкапсулировать ее где-то более разумным. Идеальным решением было бы сделать это:

(from person in repository.Query<Person>()
where personIsTheRightAge(person)
select person).Single();

bool personIsTheRightAge(Person person)
{
    return person.Age > 18 && person.Age < 50;
}

Но nhibernate не знает, как с этим справиться.

Мы могли бы предоставить методы расширения для IQueryable , но это не сработает, если я запрашиваю сущность Car с драйвером Person, и мне нужно повторно использовать ту же логику.

Мне просто интересно, есть ли у кого-нибудь хорошие идеи о том, как решить эту проблему так, чтобы ее можно было многократно использовать в проекте.

Заранее спасибо за любую помощь.

1 Ответ

0 голосов
/ 07 сентября 2011

Вы можете использовать что-то вроде DDD Спецификация для инкапсуляции логики 'правильного возраста':

usersRepository.FindByAgeSpec(RightAgeSpecification rightAge);

и

Boolean isRightAge = car.Driver.IsSatisfiedBy(rightAge);

Вам также может быть интересно посмотреть, как репозитории реализованы в DDD .

...