我有一个Listener
类,用于侦听特定的HTTP端口。
我将Listener
设置为单例(因为在特定端口上始终会有一个侦听器对象在监听)。
为此,我将默认设置为Listener()
构造器private
。制作Listener
实例(在Listener
类内部)static
并让static Listener
构造函数初始化单例Listener
对象。也有static Listener getListener()
返回单例Listener
实例。
我在侦听器回调方法正在处理的此端口上收到SOAP。
现在,我要将上次通知的日期时间推送到我的UI。
所以我以为以某种方式初始化Listener
时,我将传递一个委托,对该委托的引用将存储在Listener
中,然后每次收到通知时,在侦听器回调中,我将调用该委托并将其传递给当前时间(new DateTime()
),它将随时间执行打印消息的必要任务。我还考虑过将委托参数设置为可选,以便如果委托是null
,则在通知时将不会被调用。但是,由于我将构造函数设为私有,因此我无法弄清楚如何将委托传递给它。
总结和概括整个问题:如何将参数(作为实例成员存储)传递给singleton类?
我应该将委托传递给getListener()
吗?并在其中每次检查委托是否为空,如果不是,设置它吗?
但是,如果我通过调用Listener.getListener()
多次访问此单例对象,则每次它将不必要地检查委托为null
。事实上,这就是为什么我将初始化Listener
移至静态构造函数的原因,以避免在每次调用Listener
时检查是否初始化了getListener()
。
我应该怎么做才能将参数传递给单例类?还是这必然在getListener()
中进行检查?
注意:我不知道,但是这个问题可能归结为我们如何将参数传递给静态构造函数,因为我们需要在首次使用类时初始化事物,并且必须使用委托/其他程序构造对其进行初始化(因此我们无法从静态构造函数中的某些配置文件加载初始化参数)。
最佳答案
只需向您的单例课程添加一个正常事件:
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澄清主题!
关于c# - 将参数传递给单例类/静态构造函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20421003/