我正在开发一个项目,我们正在使用流畅的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提供扩展方法&lt;人&GT;但是,如果我查询具有驱动程序Person的Car实体并且我需要重用相同的逻辑,那将无效。
我只是想知道是否有人对如何以一种易于在项目中重复使用的方式解决此问题有一些好的想法。
提前感谢您的帮助。
答案 0 :(得分:0)
您可以使用类似DDD Specification的内容来封装“正确的年龄”逻辑:
usersRepository.FindByAgeSpec(RightAgeSpecification rightAge);
和
Boolean isRightAge = car.Driver.IsSatisfiedBy(rightAge);
您可能还会发现查看存储库implemented in DDD的方式很有趣。