2012-03-21 2 views
0

다음 코드가 응용 프로그램 전체에 흩어져 있습니다. 나는 이것을 깔끔하게 만들어서 정적 클래스 나 클래스의 유틸리티 세트에 넣고 싶다. 그래서 나는이 모든 중복을 가지고 있지 않다.어떻게이 코드를 리팩터링 할 수 있습니까?

그러나 함수의 작은 비트는 리팩토링하는 방법을 모르는 독특한 방식입니다.

private void callResponseCallback(IAsyncResult asynchronousResult) 
     { 
      try 
      { 
       HttpWebRequest webRequest = (HttpWebRequest)asynchronousResult.AsyncState; 
       HttpWebResponse response; 

       // End the get response operation 
       response = (HttpWebResponse)webRequest.EndGetResponse(asynchronousResult); 
       Stream streamResponse = response.GetResponseStream(); 
       StreamReader streamReader = new StreamReader(streamResponse); 
       string responseData = streamReader.ReadToEnd(); 
       streamResponse.Close(); 
       streamReader.Close(); 
       response.Close(); 


       ExpectedResponseType regResponse = Newtonsoft.Json.JsonConvert.DeserializeObject<ExpectedResponseType>(responseData); 

       if (regResponse.ok == "0") 
       { 
        //error - handle the msg 
        //whether the user not loggin or not exist 
        Deployment.Current.Dispatcher.BeginInvoke(() => 
        { 

         MessageBox.Show(CustomErrorMessage); 

        }); 

       } 
       else 
       { 
        //check the variables unique to the ExpectedResponseType and do Stuff here;      


       } 
      } 
      catch (WebException e) 
      { 
       // Error treatment 
       // ... 

       Debug.WriteLine("error " + e); 
      } 

내가 어떤 클래스 될 수 있도록, "ExpectedResponseType"에 전달하는 방법을 가장 궁금하고 할 수있는 이벤트를 해고하는 방법을 가능하게하거나 (즉,? T를 전달하는 방법은 무엇입니까) UI 스레드에 의해 실행되고 적절하게 처리됩니다.

감사합니다.

편집 : "ExpectedResponseType"또는 "T"는 각 유형의 서버 호출에 대한 많은 클래스 모음입니다. 예를 들어 LoginResponse, RegisterResponse, GetFilesResponse, UpdateResponse, DownloadResponse 등이 있습니다.

답변

1

EDIT : 대리인 서명이 작동하지 않으므로 이전 예제를 제거했습니다.

형식 T에 특정한 매개 변수를 확인하려면 작은 추상화를 추가해야합니다. 가장 깨끗한 방법은 아마도 템플릿 처리 클래스에서 코드를 래핑하여 해당 클래스를 처리 할 대리자를 허용하는 것입니다. 나는이 특정 패턴 확신하지만 불러올 수 없으며 확인하는 하나

당신은 아마 정리 위의 코드는 다음을 지 웁니다, 그렇지 않은 경우 T의 큰 다양성 처리에 대한 질문에 대한 응답으로
public class ResponseHandler<T> 
{ 
    public ResponseHandler(Action<T> typeSpecificCheckFunction) 
    { 
     this.CheckVariables = typeSpecificCheckFunction; 
    } 
    Action<T> CheckVariables; 
    public void callResponseCallback(IAsyncResult asynchronousResult) 
    { 
     // stuff 
     T regResponse = Newtonsoft.Json.JsonConvert.DeserializeObject<T>(responseData); 
     CheckVariables(response); 
     // stuff 
    } 
} 

이것은 제네릭이 무엇인지에 대한 것입니다 - 당신이 각 경우에 당신이 기대하고있는 것이 무엇인지 아는 한. 나는 여기에 대해 혼란 스러워요

var handler = new ResponseHandler<ExpectedResponseType>(response => 
         { 
          // code to check your response properties here 
         }); 

xxx.RegisterResponseCallback(handler.callResponseCallback); 
+0

좋아, 뭔가 내가 T의 큰 다양성을 허용 어떻게되어 각 유형에 대한 그래서 당신은 당신의 라인을 따라 뭔가를 부를 것이다 기대했다? 인터페이스를 생성해야합니까? 아니면 다른 C# 기술이 있습니까? – Bob

+0

T는 아무 것도 될 수 없습니다. 제약되지 않은 유형 매개 변수입니다. C#의 제네릭 클래스를 읽어 볼 수도 있습니다. –

+0

@Bob - ExpectedResponseType을 알 수 없습니까? 다른 말로하면 실제 질문은 알 수없는 유형의 제네릭 메소드를 호출하는 것입니다. 그것은 불가능합니다 - 제네릭이 피하려고 의도 한 것입니다. – dice

관련 문제