2013-02-08 3 views
1

오브젝트를 PATCH '으로 허용하는 REST 스타일 API를 구현 중입니다. 동작은, 설정 될 수있는 다른 프로퍼티 중 하나를 터치하지 않고도 클래스 내의 하나 이상의 프로퍼티가 갱신되도록 허용하는 것이다.이것은 패치를위한 좋은 패턴입니까

이 부분은 ServiceStack OrmLite 페이지의 부분 업데이트 예제이지만 부분적으로 업데이트 할 필드를 나타내려면 하드 코딩이 필요합니다. 내 시나리오에서는 보낼 응용 프로그램을 결정할 때까지 의존하는 응용 프로그램을 사용합니다.

개체가 아직 보존되지 않았을 수도있는 시나리오에 대처해야합니다.

이 해결하기 위해 나는 다음과 같은 구현 :

public object Patch(Myclass request) 
{ 
    HttpStatusCode SuccessCode; 
    try 
    { 
     var result = (MyClass)Get(request); 
     if (result != null) 
     { 
      request.PopulateWithNonDefaultValues(result); 
      dbFactory.Run(dbCmd => dbCmd.UpdateNonDefaults(request, r => r.myId == request.myId)); 
     } 
     else 
     { 
      dbFactory.Run(dbCmd => dbCmd.Save(request)); 
     } 

     SuccessCode = HttpStatusCode.Accepted; 
    } 
    catch (Exception e) 
    { 
     log.Error(e); 
     SuccessCode = HttpStatusCode.InternalServerError; 
    } 
    return new HttpResult() 
    { 
     StatusCode = SuccessCode 
    }; 
} 

그것은 작동하지만, 뭔가 느낌이 좋지 않습니다, 나는 더 나은 방법이있을거야?

답변

0
방금 ​​오류가있을 때 C#을 예외를 던질 수 있도록하고 ServiceStack's New API 기본 Service 클래스에서 상속하는 경우 당신은 이미 Db 속성을 사용할 수 있습니다 던져 코드가 많이 짧아집니다있어하지만 좋아 보이는

, 예 :

public object Patch(Myclass request) 
{ 

    var result = (MyClass)Get(request); 
    if (result != null) 
    { 
     request.PopulateWithNonDefaultValues(result); 
     Db.UpdateNonDefaults(request, r => r.myId == request.myId); 
    } 
    else 
    { 
     Db.Save(request); 
    } 

    return new HttpResult 
    { 
     StatusCode = HttpStatusCode.Accepted 
    }; 
} 
+0

감사합니다. Mythz, Db가 이미 저를 위해 있었음을 눈치 채지 못했습니다! 그것은 ORMLite의 확장으로서 좋은 후보가 될 것인가? 그렇다면 Db.Patch (request)를 호출 할 수 있을까요? – MikeT

+0

'db.UpdateNonDefaults'를 사용할 수도 있고, 업데이트 할 속성 만 가지고'db '를 호출하면 별도의 DTO (예 :'[Alias ​​("MyClass")] UpdateMyClass {...}})를 가질 수 있습니다. 업데이트 (요청)'. – mythz

+0

내가 가진 문제는 패치가 DTO의 하나 이상의 속성을 업데이트하도록 허용하고 있으며, 변경되는 내용에 따라 앱/사용자까지입니다. – MikeT

관련 문제