我正在为我的一个项目实施通知框架。由于我希望它非常通用,因此用户可以使用多个传输层,因此他实际上不需要关心使用一种递送方法(假设WCF)或另一种传递方法(例如ActiveMQ)。用户具有访问的接口当然独立于交付方法(WCF或ActiveMQ)。尽管如此,这两个类(消费者和生产者)实现了单例,因此它们实际上使用默认的构造函数(含义,无参数)。我的问题是我想拥有一个参数,即用户想要使用的交付方法。但是据我所知,Singleton只使用默认构造函数?这是正常的,因为应该没有使用参数的单例。那么,我在这里有什么选择?不创建单身人士?创建一种设置交付方法的方法?

非常感谢您的帮助,

塞巴斯蒂安

有帮助吗?

解决方案

当然,您可以使用单弦乐器的参数,除非将参数传递到构造函数,而是将其传递到getInstance()方法中。当然,您的覆盖构造函数必须是私人的,才能实现真正的Singleton实施。我的示例是用Java编写的,但也适用于C#。

例子:

Singleton s = Singleton.getInstance(42);

在Singleton代码中:

private Singleton() {

}

private Singleton(int num) {
   //set num
}

public getInstance(int num) {
  //singleton code (calls the private non-default constructor if an object 
  //does not already exist) 
}

其他提示

有一些依赖性注入框架,例如spring.net,可能会对您有所帮助。您可以有效地将参数传递给Singletons构造函数的配置文件中。

链接到弹簧框架示例

我可能会建议,如果您有两种不同的行为,则可能需要子类。这样,您可以通过调用所需班级行为的单身人士来获得想要的行为。

您可以通过依赖注入框架轻松执行此操作。我在当前项目中使用类似的结构 MEF. 。所需的只是使用构造函数注入选项,并将该组件和所请求的依赖项组装添加到目录中,然后将其正确固定。

另一个选项是具有某种形式的初始化函数,以获取您的选项,并构建单例实例。您可以在初始化调用期间构造它,而不是在首次访问中构造它。不利的一面是,您需要确保在使用单顿之前初始化单例(通常在程序启动时,使用配置文件)。

一个类似但易于错误的选项,就是将Singleton Lazy初始化,并给它一个“默认”选项。允许呼叫者设置一个静态属性以更改构建哪个选项,因此,如果在Singleton的构造之前设置了该选项,则将获得不同的默认值。但是,这可能会令人困惑,因为再次,您需要确保在访问Singleton之前设置该属性,否则您将获得意外的行为。

我知道回答原来的问题已经晚了,但是我只是遇到了这个问题,这就是我解决的问题。可能不是理想的,但它似乎有效。我创建了一个初始方法,在尝试使用Singleton实例之前必须调用。

public void Init(/*parameters*/)
{
        if (_isInitialized)
        {
            throw new InvalidOperationException("Component is already initialized!");
        }
        //do your work here
}

对Singleton实例的任何其他访问(属性获取,设置,方法调用)都会抛出无效的操作例外,证明该对象未初始化。

我认为这可以做到我所需要的,比getinstance(参数)不那么令人困惑,因为没有误解该方法的风险。缺点是它不会丢弃汇编时间错误,但是未完成初始化的第一次运行将引发异常,因此应该足够好。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top