2012-09-05 6 views
1

다음 연락처 DTO가 있다고 가정 해보십시오. 주소/PHONENUMBER/EmailAddress를/WebSiteAddress 클래스뿐만 아니라 (단지 데이터없는 행동) 간단한 DTO들입니다서비스에서 사용하는 DTO에서 편집 가능한 목록 모델링

public class Contact 
{ 
    public Address[] Addresses { get; set; } 
    public PhoneNumber[] PhoneNumbers { get; set; } 
    public EmailAddress[] EmailAddresses { get; set; } 
    public WebSiteAddress[] WebSiteAddresses { get; set; } 
} 
나는 다음과 같은 동작을 구현할 수 있도록하기 DTO를 모델링하는 방법을

?

클라이언트는,

  • 이 전화 번호를 추가하는 요청을 제출 두 개의 전화 번호를 업데이트하고 두 개의
  • 두 개의 이메일 주소를 추가 추가, 삭제 한 이메일 주소를 업데이트 및 삭제할 수있는 세 가지
  • 세 웹 사이트 주소를 추가하고 두 개의 웹 사이트 주소를 업데이트하고 두 개를 삭제하십시오. 당신은 아이디어를 얻습니다.

    하나의 옵션은 각 Address/PhoneNumber/EmailAddress/WebSiteAddress에 작업 속성을 추가하는 것입니다.

그런 다음 코드 업데이트 주소는 다음과 같습니다 :

 var addressesToUpdate = serviceContact.Addresses.Where(x => x.AddressAction.ToUpper() == "UPDATE"); 
     var addressesToAdd = serviceContact.Addresses.Where(x => x.AddressAction.ToUpper() == "ADD"); 
     var addressesToDelete = serviceContact.Addresses.Where(x => x.AddressAction.ToUpper() == "DELETE").Select(x => x.AddressId); 

아마 중복을 만드는 다른 모든 목록에 대해이 작업을 반복합니다.

내 질문은 :

어떻게 중복을 피하면서 업데이트 가능한 목록과 서비스의 DTO를 모델링해야합니까?

답변

1

일반적으로 나는 기록이나 모든 기록 (예 : 저장 또는 업데이트)이 없을 때 부울과 동일한 부작용 (예 : 최종 결과)을 가져야한다는 글을 계속 남기 위해 노력합니다. idempotent

기본적으로이 클라이언트가 전송하는 의미 완전한 상태 : 즉

  • 존재하지 않는 어떤 항목 => 이미 =>이 업데이트됩니다 존재
  • 엔티티,
  • 을 작성되는
  • DTO => 요청에 포함되지 않은 엔티티는 삭제됩니다.

OrmLite'sdb.Save() 명령 기록 (들)가 이미 존재하고 UPDATE 그렇지 않으면 삽입합니다 발급 경우 감지 이것에 대한 좋은 지원을하고있다.

1

완전한 상태를 제공하는 대신 조건부 요청을 사용하면 ETag을 사용할 수 있습니다. ETag를 목록의 버전으로 사용하고 목록이 변경 될 때마다 변경하십시오. 클라이언트 측에서 ETag를 사용하여 If-None-Match http 헤더를 사용하여 업데이트를 요청하고 요청이 전송되는 동안 목록이 변경되면 402 Precondition Failed 상태를받을 수 있습니다.

+0

고마워요. 체크 아웃 할 수있는 코드 예제가 있습니까? – Alper

+0

샘플이 없지만 Etag가 변경되면 내 OnPost에서 다음과 같이 사용합니다.'return new HttpResult { StatusCode = HttpStatusCode.PreconditionFailed이 상태 설명이 =}, 을 "전제 조건 실패";'내가 조건 잡기 위해 클라이언트 측에서이를 사용 : '캐치 (WebServiceException 전자) { 경우을 (e.StatusCode == (int)를 HttpStatusCode.PreconditionFailed) ...}' –

+0

그게 유용합니다. 감사. – Alper