CQRS Thin Read Layer:全文搜索适合哪些地方?

时间:2013-06-27 02:02:35

标签: domain-driven-design lucene.net cqrs

我使用CQRS精简读取层为UI提供非规范化列表/报告数据。

在我的应用程序的某些部分,我想提供一个搜索框,以便用户可以过滤数据。

Lucene.NET是我目前选择的全文搜索引擎,因为我之前已经实现了它并且对此非常满意。

但是CQS的搜索方面在哪里?

我看到两个选项,但可能还有更多。

1]我的控制器可以将搜索字符串传递给搜索层(Lucene.NET),后者返回一个ID列表,然后我可以将其传递给CQRS读取层。读取层将获取这些ID并将它们组装成WHERE ID IN(1,2,3)子句,最终将DataTable或IEnumerable返回给控制器。

List<int> ids = searchLayer.SearchCustomers("searchString");
result = readLayer.GetCustomers(ids);

2]我的瘦读取层可以直接将搜索编码到其中,所以我只需要调用

readLayer.GetListOfCustomers("search string", page, page1);

2 个答案:

答案 0 :(得分:1)

请记住,使用CQRS并不意味着您在应用程序的每个部分都使用它。将应用程序切割成较小的组件允许使用各种架构原则和模式。全文搜索API可能是这些组件之一。

答案 1 :(得分:0)

在不知道应用程序的所有细节的情况下,我会倾向于从控制器到搜索层的单个入口点(上面的选项#2)。我认为你的控制器不应该知道它需要调用第1层进行全文启用搜索,而第2层调用只进行常规WHERE子句类型搜索。

我认为你会有两个不同的'上下文'(例如SQLContextLuceneContext),这些依赖项会被注入你的ReadLayer。然后,您的阅读层逻辑应决定何时使用LuceneContext以及何时使用SQLContext;你的控制器不知道也不应该知道。

如果您的控制器知道或不得不更改,将来有令人信服的理由,这也允许您为LuceneContext换出MongoContext

如果你为所有东西使用接口(例如ISearchContextLuceneContextMongoContext实现),那么换掉上下文的唯一变化就是在你的IoC容器的初始化/规则中

所以,选择#2选项,注入你的依赖项,让你的控制器完成你的读取层,你应该好好去。希望这有帮助!