나는 DDD를 연습하고, 나는이 현재처럼 보이는 아주 간단한 예를 가지고 :저장소가 DDD로 다른 저장소에 액세스 할 수 있습니까?
Polling
getEventBus() -> Bus
getEventStorage() -> Storage
getMemberRepository() -> MemberRepository
getCategoryRepository() -> CategoryRepository
getBrandRepository() -> BrandRepository
getModelRepository() -> ModelRepository
getVoteRepository() -> VoteRepository
MemberRepository
MemberRepository(eventBus, eventStorage)
registerMember(id, uri)
-> MemberRegistered(id, uri, date)
-> MemberRegistrationFailed //when id or uri is not unique
isMemberWithIdRegistered(id)
isMemberWithUriRegistered(uri)
CategoryRepository
CategoryRepository(eventBus, eventStorage) {
addCategory(id, name)
-> CategoryAdded(id, name, date)
-> CategoryAdditionFailed //when id or name is not unique
isCategoryWithIdAdded(id)
isCategoryWithNameAdded(name)
};
BrandRepository
CategoryRepository(eventBus, eventStorage) {
addBrand(id, name)
-> BrandAdded(id, name, date)
-> BrandAdditionFailed //when id or name is not unique
isBrandWithIdAdded(id)
isBrandWithNameAdded(name)
};
ModelRepository
ModelRepository(eventBus, eventStorage)
addModel(id, name, categoryId, brandId)
-> ModelAdded(id, name, categoryId, brandId, date)
-> ModelAdditionFailed //when id or name is not unique and when category or brand is not recognized
isModelWithIdAdded(id)
isModelWithNameAdded(name)
VoteRepository
VoteRepository(eventBus, eventStorage)
addVote(memberId, modelId, vote, uri)
-> MemberVoted(memberId, modelId, vote, uri, date)
-> VoteFailed //when the member already voted on the actual model and when memberId or modelId is not recognized
여기 폴링 시스템을 개발하고 싶습니다, 그래서 우리는이 폴링 도메인을 호출 할 수 있습니다 생각합니다. 회원, 카테고리, 브랜드, 모델 및 표가 있습니다. 각 회원은 모델에 한 번만 투표 할 수 있으며 각 모델에는 브랜드와 카테고리가 있습니다. 예를 들어 inf3rno
은 Shoe
: Mizuno
- Wave Rider 19
에 10
으로 투표 할 수 있습니다. 왜냐하면 그는 실제로 그것을 좋아하기 때문입니다.
내 문제는
addModel(id, name, categoryId, brandId)
-> ModelAdded(id, name, categoryId, brandId, date)
-> ModelAdditionFailed //when id or name is not unique and when category or brand is not recognized
로하고
addVote(memberId, modelId, vote, uri)
-> MemberVoted(memberId, modelId, vote, uri, date)
-> VoteFailed //when the member already voted on the actual model and when memberId or modelId is not recognized
부품. ModelAddtion
을 고집해 봅시다.
categoryId와 brandId가 유효한지 확인하려면 CategoryRepository.isCategoryWithIdAdded(categoryId)
및 BrandRepository.isBrandWithIdAdded(brandId)
메서드를 호출해야합니다. ModelRepository
에서이 방법에 액세스 할 수 있습니까? 컨테이너를 주입하고 getCategoryRepository() -> CategoryRepository
및 getBrandRepository() -> BrandRepository
방법을 사용해야합니까? DDD에 의해 이것을 올바르게 해결하는 방법은 무엇입니까?
갱신 :
어떻게 당신이 정말로이 기능을하지 않았을 외래 키 제약하고 DB 엔진을 필요 했어 경우 도메인이 유효성 검사를 해결할 것인가?
그들 중 일부를 같은 것을 보일 것입니다 이미 존재하는 카테고리, 브랜드 또는 제품 (모델)을 누군가가 추가하려고 시도하면 복제로 이어질 수 있습니다. 인식되지 않은 회원 또는 제품 ID로 투표를 허용해도 시스템에 큰 영향을 미치지 않으며 투표 성능이 향상됩니다. 제품 추가도 마찬가지입니다. DB가 마이 그 레이션을 통해 코드가 손상 될 수 있기 때문에 스토리지 엔진에 불변성을 적용시키는 것이 좋은 방법이라고는 생각하지 않습니다. Btw. 우리는 현재 이벤트 저장소에 대해 이야기하고 있으므로 외래 키를 사용하는 것은 옵션이 아닙니다. – inf3rno
정말 흥미로운 점은 CQRS를 사용하기 때문에 도메인 객체가 필요하지 않으며 아직 작성하고 읽을 필요가 있다는 것입니다. :-) 나는 리포지토리에 유효성 검사를 옮길 수있다. 나는 이것이 최선의 방법이 아니라는 것을 알고있다. :-) – inf3rno
좋아요, 다른 관점으로 봅시다. 외래 키 제약이 정말로 필요하고 db 엔진에이 기능이 없다면 어떻게 도메인에서이 문제를 해결할 수 있습니까? :-) – inf3rno