2011-10-28 7 views
1

다음과 같은 문제가 있습니다.참조로 참조로 전달 된 다른 메서드가 업데이트 된 값으로 반환되지 않습니다.

내 컨트롤러에서 내 도메인 계층으로 전화를 걸어야합니다. 참조 (ref)로 요청을 받아들이는 웹 서비스 메서드를 호출합니다.

컨트롤러 코드 :

//BusinessEntityObject is a Reference-Type (BusinessEntity) object 
var request = View.BusinessEntityObject; 
_workflowService.PerformAction(request); 
if(request.Errors.Count != 0) 
{ 
    View.Errors = request.Errors; 
    return false; 
} 

도메인 레이어 (WorkflowService.cs 클래스) : _wcfClient.RequestSomething는 반환시 Errors 컬렉션을 수정

public void PerformAction(BusinessEntity request) 
{ 
    //TryAction(System.Action action) basically wraps action in try catch and handles exceptions 
    TryAction(() => 
      { 
       _wcfClient.RequestSomething(ref request); 
      }); 
} 

경우 요청 객체는이 오류 업데이트 오류가 수집. 그러나 제어가 컨트롤러 &으로 되돌려지면 오류 수집이 확인되고 내 업데이트가 사라집니다.

Edit00 : 오, 뻔뻔한 플러그, 나는 14 번인이고 나에게 유용한 질문/답변을 부풀려 보았습니다. 내 수준이 낮기 때문에 그럴 수 없다고합니다.

Edit01 : 덕분에 딜란은 항상 이런 식으로 아주 작은 것들을 놓칠지도 모른다고 생각합니다.

도메인 레이어 (WorkflowService.cs 클래스) :

public BusinessEntity PerformAction(BusinessEntity request) 
{ 
    //TryAction(System.Action action) basically wraps action in try catch and handles exceptions 
    TryAction(() => 
      { 
       _wcfClient.RequestSomething(ref request); 
       return request; 
      }); 
} 
+0

의도적으로 Domain Layer가 BusinessEntityObject에서 무언가를 수정하는 것을 원하지 않습니다. 적절한 경우 예외가 발생할 수 있습니다. – mozillanerd

답변

3

당신이 직렬화하는 WCF 서비스를 통해 개체를 통과, 전송 다음과 같이 나에게 값을 반환 업데이트 된 코드가 보인다 유선을 통해 전달한 다음 서버에서 deserialize합니다. "ref로"전달하면이 경우 아무 것도 변경되지 않으며 서버가 변경하면 호출자에게 다시 전송되지 않습니다. WCF 호출의 반환 값만 serialize되어 다시 전송됩니다.

데이터를 반환하는 WCF 서비스가 필요한 경우 반환 값으로 패키지를 제안합니다.

+0

다른 끝의 WCF 서비스는 Windows Workflow Foundation 4 워크 플로입니다. 서비스 끝점을 가져올 때 생성되는 클라이언트 클래스가 메서드 서명을 설정합니다. 이것은 입력 유형 (BusinessEntity 객체)과 반환 유형 (BusinessEnity 객체)이 동일하기 때문에 워크 플로에서 발생합니다. 앞에서 말한 것처럼 수정 된 객체를 반환하고 싶습니다만 wcf에 대한 클라이언트 클래스가 생성되는 방법입니다.워크 플로우는 우리가 통제 할 수없는 것입니다. – Neomoon

+0

WCF 메소드에서 데이터를 수신하려면 (예 : 업데이트 된 오류 컬렉션이 포함 된 BusinessEntity를 반환하려는 경우) 서비스 메소드의 반환 값으로 리턴해야합니다 (모든 메소드가 현재 void로 반환 된 것처럼 보입니다). –

+0

즉, 워크 플로가 변경할 수있는 것이 아니며 반환 값이없는 경우 워크 플로에서 데이터를 가져올 수 없습니다. –

0

PerformAction 방법에 ref 수정자가 없습니다.

public void PerformAction(ref BusinessEntity request) 
{ 
    TryAction(() => _wcfClient.RequestSomething(ref request)); 
} 

그러나이 변경을하면 코드가 컴파일되지 않습니다. 모든 최대

public void PerformAction(ref BusinessEntity request) 
{ 
    var r = request; 
    TryAction(() => _wcfClient.RequestSomething(ref r)); 
    request = r; 
} 

는 참조로 요청을 전달 조금 flakey 것 : 당신은 그것을 작동하게하기 위해이 같은 일을해야 할 것이다

Cannot use ref or out parameter 'request' inside an anonymous method, lambda expression, or query expression

다음과 같은 오류가 발생합니다. 새로운 (또는 같은) 인스턴스를 반환하고 외부 수준에서 배정하는 것이 좋습니다.