2014-09-23 3 views
0

원격 백엔드에 연결된 WPF 응용 프로그램이 있습니다. 사용자는 GUI에서 다양한 요소를 편집 할 수 있지만 응용 프로그램을 닫을 때만 저장하거나 취소하기로 결정했습니다. GUI 지원은 실행 취소/다시 실행을 지원합니다.저장시 명령 모음 대기 및 보내기

이미 모든 편집을 추적에 백엔드에 편집을 수행하는 데 필요한 명령을 생성 저장

: 내 명령은 뭔가 같은 :

public class ChangeDescriptionOfTypeAObject 
{ 
    public string OldValue{ get; set; }  
    public string NewValue{ get; set; } 
    public string ObjectID{ get; set; } 
} 

이 현재 응용 프로그램에서 작동하지만 내가 명령 실패하는 경우에 대해 생각하고 있어요 그 동안 다른 사용자가 동일한 속성을 변경합니다. 아마도 "개체 ObjectID에 대한 설명 변경을 적용 할 수 없습니다 : 현재 값은 xxx"라는 메시지를 사용자에게 보내야하고 다른 모든 변경 사항을 적용해야합니다.

올바른 방법입니까? "CurrentValue == OldValue"를 확인하는 데 사용하는 읽기 모델이 다른 소비자로부터 업데이트되는 경우 명령이 결국 일관성있는 프로세스에서 성공과 함께 적용될 수 있는지 어떻게 확인할 수 있습니까?

+0

내가 생각하기에 - 가장 좋은 방법은 * events *와 * commands *를 당신이 한 것보다 작게 만들고 (보통 버전 번호) 동시성 검사를 가져 오는 것입니다. 다시 현재 상태를 다시 쿼리 할 수 ​​있고 다른 모든 것이 실패하면 백엔드가 동시성 검사를 던질 것입니다 - 나는 여러분이 잠글 수없는 어떤 이유로도 이것을 피할 수 있다고 생각하지 않습니다. – Carsten

+0

좀 더 명확하게하기 위해 : 백엔드는 확인해야합니다 일관성! (프론트 엔드도 확인할 수 있지만 백엔드는 마지막 말을해야합니다.) – Carsten

답변

0

귀하의 문제에 대한 이해는 optimistic concurrency을 잘 이해하고 적용해야하며 최종 일관성을 사용할 때 실제로 권장됩니다.

Carsten König가 맞다면, 다른 사람이 백엔드에 저장하고 싶을 때 변경하는 방법을 추적해야합니다. 이 작업은 MSDN에서 TimeStamp를 사용하도록 제안하는 버전 번호로 수행 할 수 있습니다.

요점은 저장시 개체를 하나의 사용자 만 변경했거나 개체 변경 내용이 다른 변경 사항과 충돌하지 않는지 확인해야한다는 것입니다. 그렇지 않으면 오류를 발생시키고 변경 사항을 저장할 수 없다는 사실을 사용자에게 알리거나 병합 프로세스를 제공해야합니다. 때문에, 저장하거나 낙관적 동시성 정말 호환되지 않는 것입니다 만이 방법으로

문제를 닫는 응용 프로그램에 폐기

사용자가 GUI에 많은 다른 요소를 편집 할 수 있지만 로 결정 개체를 수정하는 데 시간이 오래 걸릴수록 다른 사용자 변경과 충돌을 일으킬 가능성이 가장 큽니다. "undo/redo 관리"기능은 서버와의 통신에 몇 가지 제약이 있지 않는 한 변경 사항을 가능한 빨리 서버에 알리지 않는 이유는 아닙니다. 한 사용자로하지 않는

는 도메인에 대해 허용되는 경우
  • , 당신은 (즉, 데이터가 UI에서 관리 잠금) 비관적 동시성을 사용할 수 있습니다

    나는 세 가지 솔루션이 상황의 따라 참조 응용 프로그램을 닫으십시오 (실제로는 확장 불가능한 솔루션 임). 현재 실행 취소/다시 실행 관리를 유지하십시오. 당신이 확장해야하는 경우

  • 그렇지 않으면, 결국 모든 데이터를 전송하지 않으 따라서, 낙관적 동시성을 사용하지만 모델에 대한 각 변경 후 (그리고 서버 측에서 실행 취소/재실행 공정 관리)

  • 또는 당신에게 현재의 구현을 유지, 낙관적 동시성을 추가하고 같은 객체의 다중 수정은 종종

는 희망이 도움이 발생할 경우 사용자에 대한 일부 병합 솔루션을 제공합니다.

+0

명령 처리 측은 이해하지만 처리중인 최신 이벤트가 누락 될 수있는 저장된 이벤트에서 오브젝트를 다시 작성해야합니다. ? –

+0

죄송합니다 무슨 말씀인지 모르겠군요? 쿼리 중에 개체가 만들어집니다 (UI를 만들 때). 따라서 이러한 개체를 업데이트하라는 명령을 보내면 다른 개체가 수정되지 않았는지 확인해야합니다. – Ouarzy