2011-05-06 2 views
3

우리는 같은 개체에서 여러보기 및 편집기를 지원하는 아키텍처를 고려하고 있습니다. 요구 사항은 전체 개체에 대해 수행 된 변경을 커밋하거나 취소 할 수있는 가능성입니다.여러보기, 편집기 및 커밋/취소 동기화

우리의 요구 사항이 입니다 - 많은의 같은 시간에 편집 된 객체의 (최대 다중 선택 모드에서 10.000) - 동시에 여러 뷰와 에디터 -에서 기타에 반영해야 개체에 대한 편집기에 변화 뷰를 성공적으로 완료 한 후 - 편집기의 개체는 전체적으로 커밋 가능/취소 가능이어야합니다.

동적 래퍼 방식 (http://www.codeproject.com/KB/cs/dynamicobjectproxy.aspx#EditableProxy%28implementingIEditableObject%299)을 포함하여 몇 가지 개념을 살펴 보았습니다. - 동적 인 Intellisense가 없음 - 컴파일 타임에 동적 검사가 없음 - 액세스 속성을 반복 할 때 (예 : 속성 그리드에 대한) 우리는 그림

각 편집기는 원본 객체의 자신의 클론을 얻을에 건축 설계의 프로토 타입을 구현했습니다

매우 비싸다. 그런 다음 작업을 수행하여 유효성을 검사하고 imodelrepository에 커밋 할 수 있습니다. 그렇게하면 원본 객체가 업데이트되고 각 복제본에 대해 backendchanged 이벤트가 전송됩니다. 이제 다른 backendchanged 이벤트에 등록 편집자와의 viewmodels이 변경

긍정적 인 측면

을 반영하기 위해 새로운 클론을 얻을 수 있습니다 - 각 편집기를 수 - imodelrepository은 원래의 직접 편집이 금지, 클론을 출력 그것의 자신의 복제품에 작동하십시오 - 1 명의 편집자가 변화를 투입하는 경우에 다른 복제품을 알리고 거기 내용을 새롭게하는 방법이있다 그러나 부정적인 양상은 : - 각 편집자 또는 구경꾼 viewmodel는 보내진 backendchanged 목표를 찾아야한다 원래 개체가 변경된 경우 새로운 복제본을 가져와 이전 객체를 버려야합니다. - 다른 편집기가 객체를 삭제하면 각 편집자/뷰어는 객체 삭제 이벤트를 찾아야합니다. 그런 다음 복제본을 버릴 필요가 있습니다. - 많은 수의 복제가 필요하므로 시스템이 느려집니다. 특히 편집 된 객체에서 동시에 많은 수의 객체가 사용되는 경우가 있습니다.

등록 된 뷰 모델에 원본을 전달할 생각입니다. 시청자 전용, 실제 편집자를위한 클론 사용하기. 그러면 필요한 클론 수가 줄어 듭니다. 그러나 시청자를 위해 독창적 인 독창성을 보장 할 수있는 방법은 없습니다 (동적 읽기 전용 래퍼는 위에 언급 된 editableproxy와 동일한 문제를 일으킴).

접근 방식을 단순화하는 방법이나 아이디어를 얻는 데 도움이되는 의견이나 제안은 감사 할 것입니다. 다른 아키텍처

THX

Synchronizing multiple Views

+0

편집자는 동일한 사용자/컴퓨터에서 사용하거나 원격입니다. 얼마나 빨리 변경 사항을 반영 하시겠습니까? - 모든 필드가 변경되거나 커밋 만됩니까? –

+0

편집자는 모두 같은 컴퓨터에 있습니다. 우리 시스템은 커밋의 변경 사항 만 반영하면 충분합니다. – manni

+0

즉시 변경 사항이 반영되고 커밋 제거 (실행 취소 옵션 사용)해도됩니까? –

답변

0
  • 동일 모델 객체를 상기 복수의 편집자가 동시에 개방 될 수있는 경우,
    다른 사람을 업데이트하기 위해 커밋을 기다리는 카운터 직관적 인 것입니다 (*),
    나는이 모든 경우에 동일한 VM을 사용하고 그들도 중간 상태에서 개체를 편집하고 전역 커밋 VM의 변경으로부터 저장소.

  • 동일한 모델 객체 위에 여러 편집기를 동시에 열 수없는 경우
    한 번에 하나의 VM (모델 객체 당)이 수행해야합니다.
    T4를 사용하여 뷰어에 대한 읽기 전용 VM 클래스를 생성 할 수 있습니다.이 클래스는 원래 VM 클래스와 동일하지만 속성 설정자가 없습니다.

(*) 예 : 사용은 이름을 업데이트 할 수 있고 다른 뷰어/편집자는 여전히 이전 이름을 표시하므로 사용자는 커밋하지 않고 두 명의 다른 편집자에서 이름을 두 개의 서로 다른 값으로 편집 할 수 있습니다.
한 편집자 변경이 커밋되면 재 편집 중에 다른 편집기의 변경 사항이 손실 될 수 있습니다.

  • 또 다른 방법은 (에디터의 VM에서 생성 T4 할 수있다),
    는 여러 편집자가 같은 모델 객체 저장소에 사용하는 타임 스탬프 기반의 동시성 (낙관적 동시성)를 업데이트 할 수 있도록하고 모든 사용자에 대해 하나의 읽기 전용 VM을하는 것입니다 계속해서 각 편집기에 별도의 VM을 제공하십시오.
    변경 사항은 커밋시 저장소로 공급되며, 이미 열려있는 편집자는 커밋을 시도 할 때까지 변경 사항을 인식하지 못합니다.
    커밋하려고 할 때 모델 객체가 편집 된 경우 사용자가 반응하여 (disgard, overwrite, merge) 예외를 발생시킵니다 (예 : EF에서 OptimisticConcurrencyException).
+0

입력 해 주셔서 감사합니다. 우리는 t4 코드 생성을 가능한 빨리 살펴볼 것입니다. 지금까지는 아무 것도 할 수 없었습니다. 객체 당 하나의 편집기 만 열려 있다고 보장 할 수 없으므로 두 번째 접근 방식이 우리가 갈 수있는 방법 일 수 있습니다. – manni