2011-10-07 35 views
0

我有下面的代碼使用Microsoft摩爾,靜態變量

public class SampleClass 
    { 
     static string sampleString = GetString("sample"); 

     public static string GetString(string p) 
     { 
      return DatabaseInteraction.GetData(p); 
     } 
    } 

    public static class DatabaseInteraction 
    { 
     public static string GetData(string p) 
     { 
      ///In actual implementation it is call to database 
      return string.Empty; 
     } 
    } 

在這段代碼我想嘲笑SampleClass的GetString方法的行爲。但是,當我爲此寫摩爾時,代碼拋出異常,說靜態初始化中發生了一些錯誤。 我無法在這裏找到問題。 錯誤消息:

System.TypeInitializationException: The type initializer for 'MDatabaseInteraction 
.GetString' threw an exception. ---> System.Configuration.ConfigurationErrorsException: The requested database dbPortalOracle is not defined in configuration. 

StackTrace: 
      at Microsoft.Practices.EnterpriseLibrary.Data.DatabaseConfigurationView.ValidateConnectionStringSettings(String name, ConnectionStringSettings connectionStringSettings) 
      at Microsoft.Practices.EnterpriseLibrary.Data.DatabaseConfigurationView.GetConnectionStringSettings(String name) 
      at Microsoft.Practices.EnterpriseLibrary.Data.DatabaseCustomFactory.CreateObject(IBuilderContext context, String name, IConfigurationSource configurationSource, ConfigurationReflectionCache reflectionCache) 
      at Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ObjectBuilder.ConfiguredObjectStrategy.BuildUp(IBuilderContext context, Type t, Object existing, String id) 
      at Microsoft.Practices.ObjectBuilder.BuilderStrategy.BuildUp(IBuilderContext context, Type typeToBuild, Object existing, String idToBuild) 
      at Microsoft.Practices.ObjectBuilder.SingletonStrategy.BuildUp(IBuilderContext context, Type typeToBuild, Object existing, String idToBuild) 
      at Microsoft.Practices.ObjectBuilder.BuilderStrategy.BuildUp(IBuilderContext context, Type typeToBuild, Object existing, String idToBuild) 
      at Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ObjectBuilder.ConfigurationNameMappingStrategy.BuildUp(IBuilderContext context, Type t, Object existing, String id) 
      at Microsoft.Practices.ObjectBuilder.BuilderBase`1.DoBuildUp(IReadWriteLocator locator, Type typeToBuild, String idToBuild, Object existing, PolicyList[] transientPolicies) 
      at Microsoft.Practices.ObjectBuilder.BuilderBase`1.BuildUp(IReadWriteLocator locator, Type typeToBuild, String idToBuild, Object existing, PolicyList[] transientPolicies) 
      at Microsoft.Practices.ObjectBuilder.BuilderBase`1.BuildUp[TTypeToBuild](IReadWriteLocator locator, String idToBuild, Object existing, PolicyList[] transientPolicies) 
      at Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ObjectBuilder.EnterpriseLibraryFactory.BuildUp[T](IReadWriteLocator locator, String id, IConfigurationSource configurationSource) 
      at Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ObjectBuilder.EnterpriseLibraryFactory.BuildUp[T](String id, IConfigurationSource configurationSource) 
      at Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ObjectBuilder.NameTypeFactoryBase`1.Create(String name) 
      at Microsoft.Practices.EnterpriseLibrary.Data.DatabaseFactory.CreateDatabase(String name) 

我在這裏的疑問是,如果我moled那麼爲什麼它會創建數據庫的方法是什麼? 有人可以告訴我這裏有什麼問題嗎? 謝謝 Ashwani

+1

我敢肯定,除了沒有實際只是說「在靜態初始化出現了錯誤」:這是通過 [MolesEraseStaticConstructor]屬性做如下,包括嵌套異常......請發佈確切的異常。 –

+0

對這個問題有何評論? –

+0

好吧,它看起來像你有一個配置提到「dbPortalOracle」,但你還沒有給出有關其他細節。不知道你的配置很難知道更多。看看MDatabaseInteraction的類型初始值設定項實際上是做什麼的... –

回答

0

痣框架不支持由靜態構造函數調用的繞行代碼。方法GetString(string)由類SampleClass的靜態構造函數調用。由於不支持繞行GetString表現爲未被移動。因此你的數據庫工廠被調用。

從版本v0.92.50603.1開始,有一個屬性可讓您「清除」靜態構造函數調用。

從摩爾手冊:

靜態構造與痣特殊處理。有可能 指定簡單地擦除給定類型的靜態構造函數應爲 。我懷疑它有一個完整的堆棧跟蹤 -

[assembly: MolesEraseStaticConstructor(typeof(MyStatic))] 
class MyStatic { 
    static MyStatic() { 
     throw new Exception(); // needs moling… 
    } 
}