2011-11-09 4 views
1

다른 시그니처가있는 여러 메서드가있는 인터페이스가 있습니다 (여기서 컨텍스트는 WCF 콜백 인터페이스입니다). 내 서버에는 클라이언트 목록이 있습니다. 이벤트에 응답하여 모든 클라이언트에서 인터페이스의 메서드를 호출하려고합니다. 이 호출 주위에 보일러 플레이트 코드 묶음이 있습니다 (클라이언트가 살아 있는지,이 클라이언트가 콜백에 목록에 포함되어야하는지, 잡으려고 시도하는지, 작업이 실패하면 클라이언트 놓기 등). 이 보일러 플레이트 코드를 일반 CallBackClients (SomeKindOfGenericDeligate method_to_call)로 가져 오는 가장 좋은 방법은 무엇입니까? 여기서 method_to_call은 인터페이스 메소드 중 하나입니다. 호출자의일반 메서드 호출 코드

ICallback { 
    void Fish(string my_string); 
    void SuperFish(int my_int, double my_double); 
    ... etc ... 
} 

CallBackClients(-- ?? generic delegate ?? --) { 
    foreach (IClientCallback client in client_list) { 
     // The boiler plate code: 
     if (((ICommunicationObject)client.callback).State == CommunicationState.Opened) { 
      try { 
       Do method call based on delagate/lamda code passed in - how ?? 
      } 
      catch (Exception e) { 
       Remove_client(client, method.ToString(), e); 
      } 
     } 
     else 
      Remove_client(client, method.ToString()); 
     } 
    } 
} 

의사 코드 : 당신은 방법을 캡슐화 할 수

void EventHandler_A() { 
    // Call Fish method on all clients: 
    CallBackClients(Fish("hello")); 
} 

void EventHandler_B() { 
    // Call SuperFish method on all clients: 
    CallBackClients(SuperFish(10, 5.3); 
} 

답변

2

Action<IClientCallBack>에 주어진 IClientCallBack 나중에 호출 :

CallBackClients(Action<IClientCallBack> actionOnDelegates) { 
    foreach (IClientCallback client in client_list) { 
     // The boiler plate code: 
     if (((ICommunicationObject)client.callback).State == CommunicationState.Opened) { 
      try { 
       actionOnDelegates(client); 
      } 
      catch (Exception e) { 
       Remove_client(client, method.ToString(), e); 
      } 
     } 
     else 
      Remove_client(client, method.ToString()); 
     } 
    } 
} 

이 다음과 같이 호출 할 것이다; 콜백 방법이 뭔가를 반환하는 경우

void EventHandler_A() { 
    // Call Fish method on all clients: 
    CallBackClients(client => client.Fish("hello")); 
} 

void EventHandler_B() { 
    // Call SuperFish method on all clients: 
    CallBackClients(client => client.SuperFish(10, 5.3); 
} 
+0

이 작동하지 않을 :이 지정된 client의 메소드를 호출 할 수있는 익명의 방법을 만들 수 있습니다. 하지만 여기에는 문제가 없을 것입니다. – svick

+0

이 경우,'CallBackClients' 메소드는'T'에서 일반화 될 수 있고, 델리게이트는'Func '로 변경 될 수 있습니다. 반환 값은 적절한 방식으로 전달됩니다. – thecoop

+0

콜백은 모두 무효입니다. - 그래도 괜찮습니다. – Ricibob