是否可以在C#中使用单胎构造器?
-
23-08-2019 - |
题
我正在为我的一个项目实施通知框架。由于我希望它非常通用,因此用户可以使用多个传输层,因此他实际上不需要关心使用一种递送方法(假设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(参数)不那么令人困惑,因为没有误解该方法的风险。缺点是它不会丢弃汇编时间错误,但是未完成初始化的第一次运行将引发异常,因此应该足够好。