1

インターフェイスINetworkAwareがあり、すべてのクラスがイベントに登録するように強制するメソッドを宣言する必要があります

現在プリズムイベントアグリゲーターを使用している実装は次のとおりです。

    protected override void SetupEvents()
    {
        RegisterForEvent<PatientSelected>(OnPatientSelected);
        base.SetupEvents();
    }

SetupEventsメソッドは、ViewModelbaseクラスで仮想として宣言されています。状況によっては、上記のINetworkAwareインターフェイスが必要であり、ViewModelBaseから派生して、ネットワークの変更(ネットワークオフライン/オンライン)をリッスンし、INetworkAwareインターフェイスを実装することに関心がある場合は、これに登録するように強制するメカニズムが必要です。同じプリンシパルを使用するイベント。たとえば、クラスを作成する場合

public class PatientInformationViewModel : ViewModelBase, INetworkAware
{
     protected override void SetupEvents()
     {
         RegisterForEvent<PatientSelected>(OnPatientSelected);
         base.SetupEvents();
     }

     INetworkAware.ListenForNetworkChange
     {
         RegisterForEvent<NetworkChangeEvent>(OnNetworkChange)
     }

     OnNetworkChange(NetworkChangeEvent networkstatus)
     {

     }
 }

NetworkChangeEventはサンプルPOCOクラスです

INetworkAware.ListenForNetworkChangeおよびOnNetworkChange(NetworkChangeEvent networkstatus)は、INetworkawareから派生し、同じ署名を持つすべてのビューモデルに実装する必要があります。

このシナリオをどのように達成できますか

4

1 に答える 1

2

あなたはほぼ正しい方向に進んでいます。基本クラスにインターフェイスを実装してから、基本クラスのようにメソッドを宣言するとabstract、拡張(派生)クラスが独自のバージョンを実装するように強制されます。

public abstract class ViewModelBase : INetworkAware
{

    public abstract void SetupEvents();

}

public class PatientInformationViewModel : ViewModelBase
{
    public override void SetupEvents()
    {
        //register for your events
    }
}

virtualまたは、基本クラスではなく基本クラスでメソッドを宣言しabstract、基本実装を提供することもできます。派生クラスは、必要に応じてこれをオーバーライドするだけです。私は自分の前にこのパターンを使用しましたが、非常に効果的ですUnsubscribe()。インターフェイスにも(または同様の)パターンを含めるようにしてください。

于 2012-10-02T11:01:51.823 に答える