2012-12-19 4 views
5

나는 ChatServerChatClient (WCF) 클래스를 내부에 가지고있는 클래스 ChatManager을 가지고 있습니다.구독 할 이벤트 버블

은 내가 ChatClient에있는 UserConnected, UserDisconnectedMessageReceived 이벤트를 구독 할 수 있도록 ChatManager를 인스턴스화 내 컨트롤러를 원한다.

이 작업을 수행하는 가장 우아하고 논리적 인 방법은 무엇입니까? 내가 가지고있는 ChatClient의 이벤트를 정의하는 것은 어리석은 짓이며 ChatManager 이벤트를 재정의해야 이벤트를 컨트롤러에 전달하고 ChatClient에 대해 알지 못하는 사이에 이벤트를 다시 정의 할 수 있습니까? ChatManagerChatClient의 이벤트를 구독 한 다음 ChatController이 듣고있는 자체 이벤트를 시작합니다.

WPF는 이벤트의 버블 링 개념을 가지고 있지만 이것이 사용자 인터페이스의 일부가 아니기 때문에 이러한 유형의 시나리오인지는 알 수 없습니다.

답변

2

내가 시작 했죠 모두 정당화 할 수 ChatManagerChatController 모두 여부를 질문으로 : 당신은 쉽게 당신의 부모 (ChatManager)에서 자식 클래스의 인스턴스를 호출과 같이 이벤트에 가입하여 이러한 이벤트를 구독 할 수 있습니다 그들 자신의 존재. 일반적으로 "관리자"클래스를 만들 때마다 정말 필요하지 않습니다. 특히 수행중인 작업의 일부가 단순히 메시지를 중계하는 경우에 특히 그렇습니다.

컨트롤러 클래스는 "책임"이 매우 넓기 때문에 SRP와 맞설 수 있습니다. 특정 동작에 대한 책임을 위임하려는 경우 컨트롤러와 함께 ChatClient에 대한 책임을 남겨두고 (계약 인터페이스를 통해) ChatClient으로 하위 컨트롤러를 초기화하여 필요에 따라 클라이언트와 상호 작용할 수 있도록하십시오. 부하를 제거하기 전에 해당 이벤트의 등록을 취소하는 이벤트 등록을 시작하면 클라이언트 또는 관리되는 메모리 누수가 있는지 확인하십시오.

+0

스티브, 두 사람의 존재에 대한 정당성에 대해 당신이 맞다고 생각합니다. 원래 나는 모든 서버 코드와 모든 클라이언트 코드를 관리자 클래스 자체에 가지고있었습니다. 그런 다음 저는 최근에이 두 클래스를 모두 두 개의 클래스로 리팩터링했습니다. 관리자는 서버를 시작하고 서버와 클라이언트를 인스턴스화하여 서버에 가입하는 수단 일뿐입니다. 지금은 'ChatManager'를 제거하고 컨트롤러가 그 모든 작업을 수행하는 것이 가장 좋습니다. 컨트롤러가 너무 부풀어 오르는 지 궁금합니다. 그러나 논리적으로 그 책임에 해당하는 것 같습니다. – Cowman

+0

+1 동의 함. 언제든지이 문제가 발생하면 문제를 제기하는 것이 좋습니다. – nycynik

0

이벤트를 조건부로 구독해야하는 항목에 도달해야하는 경우 (또는 여러 핸들러에서 순차적으로 처리해야하는 경우)에는 "버블 링"이 필요하지 않습니다. event aggregator을 사용하면 가장 좋은 방법 일 것입니다.

+0

글쎄, 프리즘에는 이벤트 수집기가 있습니다. 이벤트 집계를 위해 모델에 종속성을 만드는 것이 합리적입니까? 현재 ChatManager는 Prism에 대해 아무것도 모릅니다. – Cowman

+0

@Cowman 그것은 내가 생각할 몇 가지 요소에 달려 있습니다. 1) ChatManager를 포함하는 라이브러리가 Prism을 사용하지 않고 사용될 장소가 있습니까 2) Dependency를 약하게 만들 수있는 방법이 있습니까 (예 : ChatManager의 이벤트 수집기에 대한 인터페이스 만 사용하고 무엇인가 종속성을 충족시키는 방법)) – mlorbetske

1

당신이 찾고있는 버블 링 이벤트가 아닙니다.

chatManager.UserConnected += (param1, param2) => { 
    //your code here 
}; 
+2

익명의 대리자를 사용하여 이벤트를 연결하면 가비지 수집되지 않는 인스턴스로 끝나는 훌륭한 방법입니다. –

+0

동의 함. 이는 단지 기본적인 구현 일뿐입니다. 그러한 일을 처리하는보다 우아한 방법이 있습니다. –