2012-08-03 2 views
4

두 개의 하위 클래스가있는 Facade 클래스가 있다고 가정합니다. 각 서브 시스템마다 다른 이벤트가 있습니다.Facade에서 다른 클래스에 이벤트를 첨부하는 방법

FacadeClass는

public class FacadeClass 
{ 
    private SubsystemClass1 _s1; 
    private SubsystemClass2 _s2; 

    public FacadeClass() 
    { 
     _s1 = new SubsystemClass1(); 
     _s2 = new SubsystemClass2(); 
    } 
} 

하고 SubsystemClass1 다음

public class SubsystemClass1 
{ 
    public event EventHandler FetchComplete; 

    public void OnFetchComplete(EventArgs e) 
    { 
     if (FetchComplete != null) 
     { 
      FetchComplete(this, e); 
     } 
    } 
} 

SubsystemClass2

public class SubsystemClass2 
{ 
    public event EventHandler SendComplete; 

    public void OnSendComplete(EventArgs e) 
    { 
     if (SendComplete != null) 
     { 
      SendComplete(this, e); 
     } 
    } 
} 

세웠 I 외관 클래스를 사용하는 다른 클래스를했습니다 나는 SubsystemClass1에서 이벤트를 첨부 할 및 SubsystemClass2. 문제는 외관 클래스에서 이벤트를 다시 첨부하지 않고 서브 클래스를 사용하지 않고 이벤트를 첨부하는 방법입니다 (있는 경우).

public class FacadeClass 
{ 
    private SubsystemClass1 _s1; 
    private SubsystemClass2 _s2; 

    public FacadeClass() 
    { 
     _s1 = new SubsystemClass1(); 
     _s2 = new SubsystemClass2(); 
    } 

    // Redifine the event 
    public event EventHandler FetchComplete 
    { 
     add { _s1.FetchComplete += value; } 
     remove { _s1.FetchComplete -= value; } 
    } 

    public event EventHandler SendComplete 
    { 
     add { _s2.SendComplete += value; } 
     remove { _s2.SendComplete -= value; } 
    } 
} 

예는 서브 클래스를 사용하는 그들에게 사전에 공공

public class FacadeClass 
{ 
    // Make both class to public 
    public SubsystemClass1 _s1; 
    public SubsystemClass2 _s2; 

    public FacadeClass() 
    { 
     _s1 = new SubsystemClass1(); 
     _s2 = new SubsystemClass2(); 
    } 
} 

public class AnotherClass 
{ 
    FacadeClass _fd; 

    public AnotherClass() 
    { 
     _fd = new FacadeClass(); 
     // Little bit ugly 
     _fd._s1.FetchComplete += new EventHandler(_s1_FetchComplete); 
    } 

    void _s1_FetchComplete(object sender, EventArgs e) 
    { 
     // Do Something Here 
    } 
} 

감사합니다 외관 클래스의 redifine 그것을 위해

예,

관련 브라이언 ...

답변

1

이벤트를 감싸는 해결책은 나에게 꽤 좋은 것처럼 보입니다. 이 문제는 무엇입니까? 어떤면에서는 SubSystemClass를 지정하거나 FacadeClass에 일종의 래퍼를 추가해야합니다. SubSystemClasses는 비공개이므로 FacadeClass에 코드를 추가하지 않는 한 이벤트에 도달 할 수 없습니다. 내가 생각할 수있는 유일한 대안은 실행 가능한 해결책 일 수있는 반성입니다.

편집 : s1 또는 s2의 속성을 공개하려는 경우와 다른 경우 이것이 있는지 여부를 알 수 없습니다. 그렇게하고 싶다면 s1/s2를 public으로 만들거나 wrapper 속성을 제공하거나 리플렉션을 사용해야합니다.

+0

정보 숨기기로 사용합니다. 그리고 하위 클래스를 사용하는 클래스가 두 개 이상있는 경우에는 그 클래스를 다시 리플렉션해야합니다. – brian

관련 문제