Domain driven design CQRS瘦阅读层:全文搜索适合哪里?

Domain driven design CQRS瘦阅读层:全文搜索适合哪里?,domain-driven-design,lucene.net,cqrs,Domain Driven Design,Lucene.net,Cqrs,我使用CQRS瘦读取层为UI提供非规范化列表/报告数据 在我的应用程序的某些部分中,我希望提供一个搜索框,以便用户可以过滤数据 Lucene.NET是我目前选择的全文搜索引擎,因为我以前已经实现了它,我对此非常满意 但是,在CQR中,搜索的一面在哪里合适呢 我看到两种选择,但可能还有更多 1] 我的控制器可以将搜索字符串传递给搜索层(Lucene.NET),搜索层返回一个ID列表,然后我可以传递给CQRS读取层。读取层将获取这些ID并将它们组装到(1,2,3)子句中的WHERE ID中,最终将D

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

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

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

但是,在CQR中,搜索的一面在哪里合适呢

我看到两种选择,但可能还有更多

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

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

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

我假设您有两个不同的“上下文”(例如
SQLContext
LuceneContext
),这些将是注入到
ReadLayer
中的依赖项。然后,您的读取层逻辑应该决定何时使用
LuceneContext
以及何时使用
SQLContext
;您的控制器不知道也不应该知道

这还允许您在控制器不知道或不必更改的情况下,将
LuceneContext
替换为
MongoContext

如果您对所有内容都使用接口(例如,
ISearchContext
是由
LuceneContext
MongoContext
实现的),那么实际上交换上下文的唯一更改是在IoC容器的初始化/规则中


因此,使用选项2,注入依赖项,让控制器只在读取层中工作,您应该准备好了。希望这有帮助

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

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