2013-02-26 164 views
0

嘗試從WCF服務調用方法時出現類型初始化錯誤。字典初始化時出現異常

'X.Y.Z.AuditService'的類型初始值設定項引發異常。

但是,我看不到任何會導致異常的代碼。

public enum AuditProcessType 
{ 
    Facility, 
    Patient, 
    Report, 
} 


[ServiceBehavior(Name = "AuditService", 
    Namespace = "http://xyz/services/2008/08", 
    InstanceContextMode = InstanceContextMode.PerSession, 
    ConcurrencyMode = ConcurrencyMode.Single)] 
public class AuditService : IAuditServiceContract 
{ 
    private static Dictionary<AuditProcessType, Func<IAuditor>> auditServiceFactories; 

    static AuditService() 
    { 
     auditServiceFactories = new Dictionary<AuditProcessType, Func<IAuditor>>() 
     { 
      { AuditProcessType.Facility,() => Auditor<Facility>.Instance }, 
      { AuditProcessType.Patient,() => Auditor<Patient>.Instance }, 
      { AuditProcessType.Report,() => Auditor<Report>.Instance }, 
     }; 
    } 

    // ... 

    private static IAuditor GetAuditor(AuditProcessType process) 
    { 
     Func<IAuditor> factory; 
     if (!auditServiceFactories.TryGetValue(process, out factory) || factory == null) 
     { 
      throw new ArgumentException(..., "process"); 
     } 

     IAuditor auditor = null; 
     try 
     { 
      auditor = factory(); 
     } 
     catch (Exception ex) 
     { 
      throw new InvalidOperationException(..., ex); 
     } 

     if (auditor == null) 
     { 
      throw new InvalidOperationException(...); 
     } 

     return auditor; 
    } 
} 

public class Auditor<T> : IAuditor 
{ 
    private static Auditor<T> _instance = new Auditor<T>(); 

    public static Auditor<T> Instance 
    { 
     get 
     { 
      return _instance; 
     } 
    } 

    private Auditor() 
    { 
    } 

    // ... 
} 

我的日誌記錄框架沒有顯示任何內部異常的細節,所以我不能得到比這更多的信息。不管我嘗試過什麼,我似乎都無法讓VS調試器在類型初始化器中停止。不過,我不明白這段代碼是如何引發異常的。我的代碼本身並沒有做什麼,只是初始化工廠字典,它甚至不會調用AuditService<T>.Instance。還有什麼可能導致這種情況?

+0

有關詳細信息,您可以將「Auditor .Instance」屬性的代碼放入try catch塊。同時在debuger posible switchou一些屬性幫助。 – gabba 2013-02-26 17:44:15

+1

在'AuditService'上,你是否也有非靜態構造函數? – 2013-02-26 17:46:58

+0

@DanielHilgarth不,我不知道。 – 2013-02-26 17:47:32

回答

0

我跟蹤了這​​一情況,發現程序集加載錯誤。 IAuditor在與AuditService分開的程序集中定義,並且由於部署期間出現問題,所以應用程序的bin目錄中不包含IAuditor接口的程序集。它在類型初始化時給我一個錯誤,因爲那是裝配負載發生的地方。

0

爲了使類型初始值設定項失敗,它必須執行一些代碼 - 並且該代碼必須失敗。看着你已經發布什麼,可執行代碼的唯一的一塊是在這裏:

{ ... ,() => Auditor<Facility>.Instance }, 
{ ... ,() => Auditor<Patient>.Instance }, 
{ ... ,() => Auditor<Report>.Instance }, 

更改您的lambda表達式來

() => { 
    try { return Auditor<Facility>.Instance; } 
     catch (Exception ex) 
     { System.Diagnostics.WriteLine(ex.Message); } 
} 

,看看有沒有不趕上某種錯誤。

+3

lambda沒有執行。 – 2013-02-26 17:49:55

+0

是的,嗯。那麼我想知道他是否在實例化一個空字典? – sircodesalot 2013-02-26 17:56:10

+0

我的代碼創建了一個工廠方法的字典(作爲lambda表達式)。我在我的服務方法中按需創建每個「IAuditor」。實際上,我將每個工廠方法都包裝在try-catch中以保證安全,但這是在一個名爲'GetAuditor'的單獨方法中完成的。我在該問題中包含了該方法的實現以供參考。 – 2013-02-26 18:02:20