将参数传递给singleton类/静态构造函数

时间:2013-12-06 09:59:12

标签: c# oop design-patterns singleton static-constructor

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

我在这个端口上收到一个SOAP,我的监听器回调方法正在处理它。

现在我希望将上次通知的日期时间推送到我的用户界面。

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

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

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

如何将参数传递给singleton类?或者这是getListener()不可避免的检查?

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

1 个答案:

答案 0 :(得分: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澄清这个话题!