2011-09-07 88 views
2

我工作的一个项目,我们正在使用流利的NHibernate和对我们的实体仓库执行查询的NHibernate重用的业务逻辑。我们经常编写查询这样的:LINQ在查询

(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提供扩展方法< Person>但是如果我查询具有驱动程序的Car实体Person并且我需要重用相同的逻辑,那么这将不起作用。

我只是想知道如果任何人有如何的方式,很容易在一个项目重复使用解决这个问题,一些不错的想法。

在此先感谢您的帮助。

回答

0

您可以使用类似DDD Specification封装“适龄”的逻辑:

usersRepository.FindByAgeSpec(RightAgeSpecification rightAge); 

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

您可能还觉得很有意思看看仓库是如何implemented in DDD