我正在用C#编写WCF服务。最初我的实现有一个静态构造函数来进行一次性初始化,但是正在进行的一些初始化可能(暂时)失败。
看起来静态构造函数只调用一次,即使第一次(失败)尝试引发了异常?任何后续尝试实例化我的类都将立即失败,并且TypeInitializationException
没有实际执行代码。
C#语言规范声明静态构造函数最多被调用一次,但基本上这会产生一个异常,即使你抓住它也无法从中恢复?
我在这里遗漏了什么吗?我想我应该向服务的实例构造函数移动任何远程危险的东西,并手动检查类初始化是否已经成功完成了早期?
答案 0 :(得分:4)
这里的教训很简单:不要在可能合理失败的静态构造函数中做任何事情。
答案 1 :(得分:3)
所以你可以将关键部分包装在try / catch中,至少这意味着类型不会初始化,但是如果初始化代码是关键的,那么这种行为实际上是好的 - 类型不可用在这个未初始化的状态。
另一种选择是将其作为单例进行 - 每次尝试获取实例时,您都可以正确创建类型,直到成功为止,即使第一次失败也是如此。
如果Instance在第一次(或第二次)等时间返回null,你仍然需要对调用者进行一些错误处理。
编辑:如果您不想要单例,那么只需让您的实例构造函数初始化静态部分
e.g。
private object _lock = new object()
private bool _initialized;
public T()
{
lock(_lock)
{
if(!_initialized)
{
try
{
//Do static stuff here
}
catch(Exception ex_)
{
//Handle exception
}
}
}
}
答案 2 :(得分:1)
我过去使用的解决方法是创建一个Singleton。当且仅当失败意味着整个应用程序无法运行时,使静态构造函数失败。