4

2 つのサブシステム クラスを持つ Facade クラスがあるとします。サブシステムごとに異なるイベントがあります。

ファサードクラスは

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);
        }
    }
}

ファサード クラスを使用する別のクラスがあり、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
    }
}

前もって感謝します、

よろしくブライアン...

4

1 に答える 1

1

イベントをラップするソリューションは、私にはかなり良いようです。これの何が問題なのですか?何らかの方法で、SubSystemClass を指定するか、FacadeClass にある種のラッパーを追加する必要があります。SubSystemClasses はプライベートであるため、FacadeClass に何らかのコードを追加しない限り、イベントにアクセスすることはできません。私が考えることができる他の唯一のオプションは、実行可能な解決策であるリフレクションです。

編集:これがs1またはs2のプロパティを公開したい場合と異なるかどうかはわかりません。そのためには、s1/s2 を公開するか、ラッパー プロパティを提供するか、リフレクションを使用する必要があります。

于 2012-08-03T02:15:41.910 に答える