如何在LINQPad中模拟ConfigurationManager

时间:2016-09-29 13:50:29

标签: c# linqpad

我正在尝试在LINQPad中测试一些代码。但是,base类调用Configuration Manager。在LINQPad中进行测试时,如何模拟它。

void Main()
{
    var tRepo = new TestRepository();
    var result = tRepo.GetAsync(1);
    result.Dump();
}

public partial class TestRepository : BaseRepository<Customer>, ICustomerRepository 
{
    // Here base throws the errror
    public TestRepository() : base("DbConnString")
    {            
    }
}

这是BaseRepository的构造函数(来自已编译的DLL,因此在LINQPad中不可编辑):

protected BaseRepository(string connectionStringName)
{
    var connectionString = ConfigurationManager.ConnectionStrings[connectionStringName];

    Connection = new SqlConnection(connectionString.ConnectionString);
    Connection.Open();
}

2 个答案:

答案 0 :(得分:10)

答案可以在LinqPad网站上找到答案

http://www.linqpad.net/faq.aspx

  

我正在引用一个从应用程序配置文件(app.config)读取设置的自定义程序集。我应该在哪里放置我的应用程序配置文件,以便LINQPad查询将其获取?

     

在与LINQPad.exe相同的文件夹中创建名为linqpad.config的文件,并将配置数据放在那里。不要将此与linqpad.exe.config混淆:

     

•linqpad.exe.config用于LINQPad GUI

     

•linqpad.config适用于您的查询。

答案 1 :(得分:2)

可能对你有用的东西,我是在不久前创建的。

这是一种扩展方法,可用于强制从特定文件重新加载配置。它使用反射来更改管理器中的私有字段,清除配置,然后有条件地重新加载它。它比手动编辑LINQPad的配置文件容易得多。

public static void ForceNewConfigFile(this Type type, bool initialize = true)
{
    var path = type.Assembly.Location + ".config";
    if (!File.Exists(path))
        throw new Exception("Cannot find file " + path + ".");

    AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", path);

    var typeOfConfigManager = typeof(ConfigurationManager);
    typeOfConfigManager.GetField("s_initState", BindingFlags.NonPublic | BindingFlags.Static).SetValue(null, 0);
    typeOfConfigManager.GetField("s_configSystem", BindingFlags.NonPublic | BindingFlags.Static).SetValue(null, null);

    var typeOfClientConfigPaths = typeOfConfigManager.Assembly.GetTypes().Where(x => x.FullName == "System.Configuration.ClientConfigPaths").Single();
    typeOfClientConfigPaths.GetField("s_current", BindingFlags.NonPublic | BindingFlags.Static).SetValue(null, null);

    if (initialize)
    {
        var dummy = ConfigurationManager.AppSettings;
    }
}

使用示例:

typeof(SomeType).ForceNewConfigFile();

System.Configuration.ConfigurationManager.AppSettings.Dump();

SomeType只是程序集中包含的类型,它将用作配置文件位置的源。假设是:配置文件存在于DLL文件旁边,名为{Assembly.Location}.config