我使用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);
答案 0 :(得分:1)
请记住,使用CQRS并不意味着您在应用程序的每个部分都使用它。将应用程序切割成较小的组件允许使用各种架构原则和模式。全文搜索API可能是这些组件之一。
答案 1 :(得分:0)
在不知道应用程序的所有细节的情况下,我会倾向于从控制器到搜索层的单个入口点(上面的选项#2)。我认为你的控制器不应该知道它需要调用第1层进行全文启用搜索,而第2层调用只进行常规WHERE
子句类型搜索。
我认为你会有两个不同的'上下文'(例如SQLContext
和LuceneContext
),这些依赖项会被注入你的ReadLayer
。然后,您的阅读层逻辑应决定何时使用LuceneContext
以及何时使用SQLContext
;你的控制器不知道也不应该知道。
如果您的控制器知道或不得不更改,将来有令人信服的理由,这也允许您为LuceneContext
换出MongoContext
。
如果你为所有东西使用接口(例如ISearchContext
由LuceneContext
和MongoContext
实现),那么换掉上下文的唯一变化就是在你的IoC容器的初始化/规则中
所以,选择#2选项,注入你的依赖项,让你的控制器完成你的读取层,你应该好好去。希望这有帮助!