2011-01-02 4 views
0

HTTP를 사용하는 JSON RPC 인터페이스를 통해 XBMC과 통신하기 위해 C#에서 .NET 라이브러리를 코딩하고 있습니다.C# async http 라이브러리에서 많은 양의 대리인과 usercallback을 관리하는 방법

나는 코드화하여 preliminary version을 릴리스했지만 모든 것은 동 기적으로 수행됩니다. 그때 나는 자신의 목적을 위해 비동기 적으로 라이브러리를 recoded/XBMC remote for WP7 건물입니다.

이제 새로운 비동기 라이브러리를 릴리스하고 싶지만 이전보다 멋지고 정리가 잘되었는지 확인하고 싶습니다.

비동기 특성으로 인해 사용자가 요청을 시작하고 내 대리인과 일치하는 콜백 메서드를 제공 한 다음 응답을받은 후 처리합니다.

내가 가진 문제는 요청의 수명 동안 RequestState 객체를 추적하고, HTTP 요청/응답은 물론 멤버 변수로 사용자 콜백 등을 포함한다는 것입니다.이 경우에만 괜찮습니다. 한 가지 유형의 객체가 돌아 왔지만 사용자가 무엇을 부르는 지에 따라 노래 목록이나 영화 목록 등이 반환 될 수 있습니다.

내 구현은 현재 단일 매개 변수 인 ResponseDataRecieved를 사용합니다. 간단한 개체 - 이것은 나만이 사용하기 때문에 어떤 메소드가 무엇을 반환하는지 알 수 있습니다. 응답을 처리 할 때 객체를 실제로 알고있는 유형으로 캐스팅했습니다 - 목록, 목록 등

제 3자가 이것을하지 않아도됩니다. - 위임자 서명에 올바른 유형의 객체가 포함되어야합니다. 그래서 제 3 자에게 반환 될 수있는 모든 유형의 응답 데이터에 대해 대리인이 필요합니다. 특정 문제는 내부적으로이를 어떻게 적절하게 처리해야합니까? 각기 다른 멤버 변수를 가진 여러 RequestState 개체가 있습니까? 다른 대표들에게? 그건 "느낌"이 옳지 않습니다. 나는 이걸 우아하고 깨끗하게하는 법을 모른다.

답변

0

정확하게 이해했다면 여러 메소드를 제공하는 인터페이스가 있습니다. 각 메소드는 기본적으로 같은 종류의 델리게이트를 사용하지만 다른 유형의 매개 변수를 입력으로 사용합니다. 이런 식으로 뭔가 :

GetListOfSongs(..., delegate(List<Song> result) { ... }); 
GetListOfMovies(..., delegate(List<Movie> result) { ... }); 

하고 인터페이스의 방법과 함께 자르기 시작 대리인이 서명에 대한 걱정?

그렇다면 제네릭이 당신이 찾고있는 것입니다. 실제로 대리자 서명이 예제와 일치하면 (즉, 하나의 입력 매개 변수를 허용하는 경우) 아무 값도 반환하지 않습니다. 원하는 대리자 형식이 BCL에 이미 있습니다. 그것은 Action<T>입니다. 즉, Action<T>

GetListOfSongs(..., Action<List<Song>> callback); 
GetListOfMovies(..., Action<List<Movie>> callback); 

당신은 여전히 ​​하나의 대리자 형식이있을 것이다 : 당신과 같이 위의 메소드를 선언 할 수있다.

이제 여러 매개 변수를 전달해야하는 경우에도 계속 적용됩니다. 최대 16 개의 입력 매개 변수에 대한 액션 버전이 있습니다 (서명이 조금 번쩍 거리기 시작 함 : Action<T1, T2, T3 ...>).

Func<T, TResult>이 콜백을 사용하여 인프라 내에서 사용할 값을 반환하려면 (T는 입력 매개 변수 유형, TResult는 대리자).

보너스로, 귀하의 인터페이스에 List<T>을 노출시키지 않는 것이 좋습니다.모든 클라이언트가 목록 작업을 필요로한다고 생각한다면 IList<T>을 사용하십시오. 그렇지 않은 경우 ICollection<T> 또는 IEnumerable<T>을 고려하십시오.

+0

덕분에 상세하고 유용한 답변을 얻을 수 있습니다. 나는 여전히 내 머리를 감싸고있는 문제에 대해 어떻게 표현할 것인가? 내 RequestState 객체에 액션 을 표현할 때 나는 타입 변수를 멤버 변수로 선언 할 때 타입을 제공해야하지만 실제로는 런타임까지 알지 못한다. 내 문제를 더 명확하게 설명하는 예제 코드를 pastebin'd했습니다. 나는 이것에 대해서 너무 n00b되지 않기를 바란다. (- http://pastebin.com/qjJgFPmV – Tyler

+0

이제 코드를 살펴보면 일반 유형 매개 변수의 전파가 상당히 많이 보일 것 같아 보인다. 이제 끝내야 겠지만, 나중에 자세히 살펴볼 시간을 찾으려고 노력할 것입니다. 그 동안 다른 사람이 찔러보고 싶어하면 그것을 찾으십시오. :-) – Rytmis

+0

이것은 완전한 예가 아니며 전체 소스 코드가 없기 때문에 내가 잘못 생각한 것일 수도 있습니다. 그러나 XDataReceived 콜백을 적용 할 경우 액션으로 바꿨습니다. – Rytmis

0

가장 먼저 떠오르는 것은 generics입니다. ResponseDataRecieved<T> 여기서 T는 콜백에서 예상되는 유형입니다. 그러나 콜백을 캡처 된 변수로 저장할 수 있습니다. 예 :

public delegate void CallBackA(int i); 
public delegate void CallBackB(string s); 

public class RequestHandler 
{ 
    public void QueueRequestA(CallBackA callback) 
    { 
     Task.Factory.StartNew(() => 
            { 
             int ret = 0; 
             //ret = get stuff of type A from server 
             callback(ret); //callback is captured here 
            }); 
    } 

    public void QueueRequestB(CallBackB callback) 
    { 
     Task.Factory.StartNew(() => 
            { 
             string str = ""; 
             //str = get stuff of typw B from server 
             callback(str); //callback is captured here 
            }); 
    } 
}