将基本事件的事件重写到流c#的应用程序和序列

本文关键字:事件 应用程序 重写 | 更新日期: 2023-09-27 18:22:51

将事件从基类传播到继承或实现的应用程序的最佳方式或最佳实践是什么?因为我希望从基类到MyClientListener再到Winform执行所有代码?

我有一个[WCF DuplexClient]类,其他[WCF ClientListener]类将从该类派生。我想让它可用于我的所有服务。我有一个事件InnerChannel_Faulted-在这个基类中,我在基类中有一个初始化器,它订阅事件,基类通常会处理这些事件,直到WCF方面。我还希望能够让我的特定ClientListener实现能够提供额外的功能——这些事件的行为——主要是针对Winforms应用程序。

我的想法是正确的吗?还是我需要把这些事件反馈到食物链的上游,以便它们可以在Winforms应用程序中使用?

我在基类中制作了这样的处理程序:

    class MyClient<T> :DuplexClientBase<T> where T : class
    {
    protected virtual void InitializeClient()
    {
          base.InnerChannel.Faulted += InnerChannel_Faulted;
    }
     protected virtual void InnerChannel_Faulted(object sender, EventArgs e)
    {
     // ... do something()
    }
    }
class MyListener :  MyClient<MyListenerService>
{
public MyListener(){ // do stuff}
// .. other methods
}
WINDOWFORMAPP : FORM
{

  private MyListener mylistener = new MyListener();
  WINDOWFORMAPP()
{
// somehow subscribe to 
mylistener.InnerChannel_Faulted += 
}
  private override void InnerChannel_Faulted(object sender, EventArgs e)
{
 // DoSomething to GUI - notifications GUI elements etc.. 
// then call.
  mylistener.InnerChannel_Faulted()
}
}

将基本事件的事件重写到流c#的应用程序和序列

从同一类或子类订阅事件不是标准的。通常的方法是将代码结构为:

public class MyClass {
   public event EventHandler SomeAction;
   private void DoStuff() {
       bool fireAction = false;
       //....
       if (fireAction) {
          EventArgs e = ...; // can be more specific if needed
          OnSomeAction(e);
       }
   }
   protected virtual void OnSomeAction(EventArgs e) {
     if (SomeAction != null)
         SomeAction(this, e);
   }
}
public class MySubclass : MyClass {
   protected override void OnSomeAction(EventArgs e) {
      // code before event is triggered
      base.OnSomeAction(e); // fires event to listeners
      // code after event is triggered
   }
}

然后以您的形式:

public class MyForm : Form {
  MyClass mc = new MyClass();
  public MyForm() {
      mc.SomeAction += mc_SomeAction;
  }
  private void mc_SomeAction(Object sender, EventArgs e) {
     //...
  }
}