2011-10-07 60 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… 
    } 
}