3

我有一个Listener类来监听特定的 HTTP 端口。我制作了Listener单例(因为总会有一个侦听器对象在特定端口上侦听)。为此,我制作了默认Listener()构造函数private。制作Listener实例(在Listener类内部)static并让static Listener构造函数初始化单例Listener对象。也有static Listener getListener()which 返回单例Listener实例。

我在此端口上接收到一个 SOAP,我的侦听器回调方法正在处理该 SOAP。

现在我想将最后一次通知的日期时间推送到我的 UI。

所以我想的是,在初始化时Listener我会传递一个委托,一个对它的引用将被存储在里面Listener,然后每次我收到通知时,在监听器回调中我会调用那个委托并传递它当前时间(new DateTime()),这会做随着时间的推移打印消息的必要任务。我还想过让委托参数可选,这样如果委托是null它就不会在通知时被调用。但是,由于我将构造函数设为私有,因此我无法弄清楚如何将委托传递给它。

总结和概括整个问题:如何将参数(作为实例成员存储)传递给单例类?

我应该将委托传递给getListener()吗?并在其中每次检查委托是否为空,如果不是,设置它?但是,如果我通过调用访问这个单例对象太多次Listener.getListener(),每次它都会不必要地检查委托是null。事实上,这就是为什么我将初始化转移Listener到静态构造函数只是为了避免检查是否Listener在每次getListener()调用时都被初始化。

我应该怎么做才能将参数传递给单例类?或者这是getListener()不可避免的检查?

注意:我不知道,但这个问题可能归结为我们如何将参数传递给静态构造函数,因为我们需要在第一次使用类时初始化事物,并且我们必须使用委托/其他编程构造来初始化它(因此我们不能从静态构造函数中的某个配置文件加载初始化参数)。

4

1 回答 1

0

只需向您的单例类添加一个正常事件:

public class Listener
{
  //declare a delegate for the event
  public delegate void InformationDelegate(DateTime timestamp);

  //declare the event using the delegate
  public event InformationDelegate Information;

  public void SomeFunction()
  {
    // do something...
    if(Information != null)
    {
      Information(DateTime.Now);
    }
  }

  // singleton handling etc... 
}

然后每个想要获得通知的对象都在单例实例上注册自己:

class SomeUIClass
{
  void AFunction()
  {
    Listener.Instance.Information += InformationHandling;
  }

  public void InformationHandling(DateTime timestamp)
  {
    // do something with the information
  }
}

感谢@Kami 澄清了这个话题!

于 2013-12-06T11:21:07.207 回答