允许动态过滤/查询存储库<somedomainmodel> </somedomainmodel>的体系结构

时间:2011-12-13 15:45:10

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

我正在寻找一个可以解决以下问题的可靠架构:

作为用户,我想通过动态添加标准来动态过滤某些人员数据库。 我还希望能够根据过滤器的结果将所选字段仅批量更新到数据库。

以下情况属实:

  • 我有一个3层解决方案(GUI,业务层,数据访问层)。
  • 假设我有Repository<Person>Person是域模型。
  • 存储库支持linq,可以给我:IQueryable<T> GetAll()

我有一些想法:

  • 我正在考虑使用动态表达式API,它扩展了LINQ功能,因此我可以动态添加搜索标准。
  • 我看过NHibernate QueryBuilder,这可能是借用它的想法。

解决方案理论:
所以,无论如何我想到GUI要求DomainModel描述自己(存在哪些属性,允许哪些运算符,以及允许的值类型是什么) 这样,我可以为属性和允许的运算符渲染一些级联下拉列表。 我正在考虑从模型中的方法描述属性,例如:DescribeMyself(); 然后将其与使用Attributes装饰属性相结合。

问题:
那么如何描述模型的属性呢,你会怎么做?例如,属性string Name应该可以使用Equals的运算符或类似的运算符进行搜索。
枚举怎么样?想象一下MyGenderEnum Gender。在进行Equals过滤器时,我需要描述它必须与给定枚举中的任何值匹配。

要考虑的事情!

1 个答案:

答案 0 :(得分:0)

这是一个相当广泛的问题。

只是一些观点:

  • 支持动态添加搜索条件到IQueryable<T>。只需为Where添加针对每个条件的调用:

    repository.GetAll<Person>().Where(x => criteria1(x)).Where(x => criteria2(x));

  • 让模型描述自己是我不会做的事情。我会创建一个新类,类似于Fluent NHibernates ClassMap<T>或Fluent Validations AbstractValidator<T>