검색어 서비스에서 검색을 구현해야합니다. 당신은 귀하의 경우와 같은 명령을 사용하여 모델을 업데이트 할 때 때문에
CQRS은 DDD와 정말 잘 맞는 :
AnswerToQuestionCommand, PostNewQuestionCommand 등
이러한 명령은 응용 프로그램 서비스로 전송된다
이는 엔티티를 업데이트하고, 엔티티는 6 각형 아키텍처에서 인터셉트되어 검색 인덱스를 업데이트하는 DomainEvent를 보냅니다. 6 각형 아키텍처에서이를 수행 할 수 있습니다. 동일한 트랜잭션에서 인덱스를 유지 관리하는 전용 서비스를 호출합니다. 인덱스가 예를 들어 업데이트 된 경우 엔티티가 지속되는 것으로 간주합니다. 나는이 길로 갈 것이다. 당신은 당신이 쿼리 서비스를 통해 이동 등 질문, 답변, 쿼리해야하는 경우 여기
봄 @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는 매우 빠르다.
@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);
}
}
내가 당신의 질문이 너무 광범위하다고 판단 :
내가 쿼리 서비스에 본이 버논의 접근 방식 (https://github.com/VaughnVernon/IDDD_Samples)를 제안, 나는 쿼리 서비스에 대한 나의 부분에 루씬을 사용, 여기에 몇 가지 코드입니다. 더 자세하게 얘기해 주 시겠어요? 아마도 몇 가지 코드를 제공하고 특정 질문을 던지십시오. – w0051977
제공 할 세부 정보가 확실하지 않습니다. 제 질문은 좀 더 광범위합니다. 검색 컨텍스트에서 최상위 클래스를 이해하고 싶습니다. 설명을 약간 변경했거나, 내가 제공 할 수있는 세부 정보를 도울 수 있거나 친절하게 제안 할 수 있습니다. –
스택 오버 플로우의 지적 재산이라고 생각합니다. DDD에 관한 많은 훌륭한 책들이 있습니다. 만약 당신이 그들을 살 수 있다면? 학습 한 개념을 적용 할 수 있습니다. – w0051977