クエリサービスで検索を実装する必要があります。
CQRSあなたがコマンドを使用するモデルを更新したい場合ので、そのようなあなたの場合のように、DDDで本当に良いフィット:
AnswerToQuestionCommand、PostNewQuestionCommandなど
をこれらのコマンドは、アプリケーションのサービスに送信されますエンティティを更新します。エンティティは、六角形のアーキテクチャでインターセプトされ、検索インデックスを更新するDomainEventを送信します。六角形のアーキテクチャでは、同じトランザクション内でインデックスを維持するために専用のサービスを呼び出すことで実行できます。たとえば、インデックスも更新されている場合は、エンティティが永続化されているとみなされます。私はこのように行くだろう。あなたはクエリサービスを経るなど、あなたの質問、回答、照会する必要がある場合はここで
は春@TransactionalEventListener
@Component
public class ProjectRenamedListener {
@Value("${spring.jpa.properties.hibernate.search.default.indexBase:target}")
private String indexBase;
private final Logger logger = LoggerFactory.getLogger(ProjectRenamedListener.class);
@TransactionalEventListener
public void projectRenamed(final ProjectRenamed event) {
try (final StandardAnalyzer analyzer = new StandardAnalyzer();
final Directory directory = NIOFSDirectory.open(Paths.get(indexBase, ProjectData.class.getName()));
final IndexWriter writer = new IndexWriter(directory, new IndexWriterConfig(analyzer))){
final Document document = new Document();
document.add(new StringField("project_id", event.projectId().identity(), Field.Store.YES));
document.add(new StringField("tenant_id", event.tenant().identity(), Field.Store.YES));
document.add(new TextField("name", event.name(), Field.Store.YES));
writer.updateDocument(new Term("project_id", event.projectId().identity()), document);
} catch (IOException e) {
logger.warn("Unable to update index for project name.", e.getMessage());
}
}
}
のサンプルです。インデックスを尋ね、クライアントに返すエンティティを読み込みます。
これの美しさは、それを変更して照会するときに同じオブジェクトである必要はないということです。コードの重複のために始めるとちょっと聞こえるが、長期間に渡って読み込み/クエリの操作が頻繁に起こって高速でなければならないので、明らかに優れた解決策であり、 ontは特別に超高速でなければなりません。私は、クエリサービス(https://github.com/VaughnVernon/IDDD_Samples)にヴォーンバーノンのアプローチを示唆し
、私はクエリサービスのための私の部分にはLuceneを使用し、ここでいくつかのコードは次のとおりです。
@PreAuthorize("hasAuthority('Administrator')")
public Page<ProjectData> searchProjectsData(
final String tenantId,
final String queryText,
final Pageable pageable) {
if (!StringUtils.isEmpty(tenantId)) {
return this.searchProjectsDataOfTenant(tenantId, queryText, pageable);
}
final StandardAnalyzer analyzer = new StandardAnalyzer();
final QueryBuilder builder = new QueryBuilder(analyzer);
final Query query = builder.createPhraseQuery("name", queryText);
try {
final IndexReader reader = DirectoryReader.openIfChanged(this.directoryReader);
final IndexSearcher searcher = new IndexSearcher(reader);
final TopDocs documents = searcher.search(query, pageable.getPageSize());
return this.fetchProjectsData(searcher, documents, pageable);
} catch (IOException e) {
throw new RuntimeException(String.format("Unable to search project for query: %s", queryText), e);
}
}
私はあなたの質問が広すぎると考えています。あなたはもっと具体的になりますか?おそらく、いくつかのコードを提供し、特定の質問をしてください。 – w0051977
私は何を提供するか分かりません。私の質問はもう少し幅広く、私は検索コンテキストのために演奏中のトップレベルのクラスを理解したい。私は説明を少し変更しました、それは助けてくれるかもしれませんし、親切に私が提供できる詳細を提案するかもしれません。 –
私はあなたが求めているのは、スタックオーバーフローの知的財産だと思います。 DDDにはたくさんの良い本があります。おそらくあなたはそれらを買うことができますか?学習した概念を適用することができます。 – w0051977