는 메모리 변경시 CQS를 구현하는 방법은 무엇입니까?
http://www.infoq.com/interviews/greg-young-ddd
DDD
에 그렉 Yound하여이 비디오를 시청 데 난 당신이 메모리 변경에있을 때 DDD와 명령 쿼리 분리 (CQS)를 구현할 수 궁금 해서요?CQS에는 명령과 쿼리를위한 두 개의 리포지토리가 있습니다. 두 개의 개체 그룹, 명령 개체 및 쿼리 개체. 명령 개체에는 메서드 만 있고 개체의 모양을 노출시킬 수있는 속성이 없으며 화면에 데이터를 표시하는 데 사용되지 않습니다. 반면에 쿼리 개체는 화면에 데이터를 표시하는 데 사용됩니다.
비디오에서 명령은 항상 데이터베이스로 이동하므로 쿼리 리포지토리를 사용하여 업데이트 된 데이터를 가져 와서 화면에 다시 표시 할 수 있습니다.
CQS를 ASP.NET의 화면 편집과 같이 사용할 수 있습니까? 변경 사항이 메모리에 변경되고 화면이 변경 사항을 여러 번 업데이트해야 변경 사항이 데이터베이스에 유지됩니다. 예를 들어
- 나는
- 내가 쿼리 객체 저장소에서 질의 객체를 다시 반입과에 표시 편집
- 을 클릭 쿼리 저장소에서 질의 객체를 가져 와서 화면에 표시 양식 편집 모드
- 양식의 값을 변경하여 자동 포스트 백하고 명령 개체를 반입하고 관련 명령을 실행합니다.
- 수행 할 작업 : 이제는 upda를 표시해야합니다. ted 오브젝트가 명령 필드로 변경되면서 계산 된 필드가 변경됩니다. 명령 개체가 데이터베이스에 저장되지 않았으므로 쿼리 리포지토리를 사용할 수 없습니다. 그리고 CQS를 사용하면 화면에 표시 할 명령 개체의 모양이 노출되지 않습니다. 업데이트 된 변경 내용을 화면에 표시하기 위해 쿼리 개체를 다시 얻는 방법은 무엇입니까?
내가 생각할 수있는 몇 가지 해결책은 세션 저장소 또는 명령 개체에서 쿼리 개체를 가져 오는 방법입니다. CQS가 이러한 유형의 시나리오에 적용되지 않습니까?
비디오 변경 사항이 데이터베이스에 즉시 반영되고 CQS와 함께 DDD의 예가 도메인 개체의 변경 사항을 일괄 적으로 처리하고 마지막으로 도메인 객체를 저장하라는 명령을 내리기 전에 수정 된 도메인 객체.
답장을 보내 주셔서 감사합니다. 데이터베이스에 직접 반영되지 않고 변경 사항이 메모리에있을 때 CQS를 사용하는 것이 얼마나 일반적인지/좋은 디자인인지 궁금합니다. 이것은 기본적으로 세션 저장소를 사용하여 쿼리 리포지토리가 세션 변수를 통해 명령 데이터에 액세스 할 수있게하는 것입니다. 나중에 HttpContext 리포지토리가 필요할 수 있습니다. 이전에 본 사람이 있습니까? 생각은 감사했다. – Ian
제 생각에는 데이터 원본을 조작하는 데 사용하는 메서드가 데이터 원본의 종류에 의존하지 않아야합니다. 리포지토리 패턴을 사용하면 이러한 차이점을 추상화하여 쿼리 할 수있는 개체 컬렉션 인 것처럼 모든 데이터 원본을 처리 할 수 있습니다.이론적으로는 'InMemoryRepository'와 'DatabaseRepository'를 갖게 될 것입니다 - 또는 무엇을 가지고있을 것인가는 대상 데이터 소스를 결정하는 것은 개별 저장소 구현에 달려 있습니다. –
네, 데이터베이스 저장소를 위해 InMemory 저장소를 바꿀 수 있다는 것을 알고 있습니다. CQS의 가치 중 일부는 데이터베이스에 명령을 실행하고 업데이트 된 데이터를 쿼리 리포지토리와 별도로 되돌려 놓는 것입니다. 메모리에서 명령 개체는 세션에 있으므로 쿼리 리포지토리는 명령 개체의 데이터 만 되돌릴 수 있습니다. 데이터베이스 버전을 사용하면 쿼리 개체가 명령 개체와 완전히 다를 수 있으며 메모리 CQS와의 관계가 훨씬 비슷해 보입니다. 이것이 CQS가 성취하려고 시도한 것과 어울리는지 궁금합니다 – Ian