如何在LINQPad中模拟ConfigurationManager

8

我正在尝试在LINQPad中测试一些代码。然而,base类调用了配置管理器。在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();
}
3个回答

15

答案可以在LinqPad网站的FAQ页面找到。

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

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

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

• linqpad.exe.config用于LINQPad GUI

• linqpad.config用于您的查询。


我发誓我看的时候那里没有,但现在出现了,谢谢。 - M Kenyon II
7
注意:linqpad.config会影响所有查询。最新版本的LinqPad有一个选项在查询属性(F4)中,可以指定自定义app.config的路径,甚至可以直接粘贴app.config的内容。 - sgmoore
@sgmoore,您说得确实对。我以前从未见过这个选项。 - Simon Price
你看过这个了吗? where-is-app-config-in-linqpad-6
  • 它描述了在 LINQPad 6 中配置设置文件发生了什么变化。在 LINQPad 5 的 F4 对话框中的选项卡在 LinqPad 6 中已经消失了。
- Matt

3

这是一段可能对你有用的内容,我之前创建了它。

这是一个扩展方法,你可以使用它来强制从特定文件重新加载配置。它使用反射来更改管理器中的私有字段,清除配置,然后有条件地重新加载它。相比手动编辑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


0

我也曾寻找这个功能,但不想创建一个全新的文件、指向它,或让其他人共享该文件等。因此,我在 ConfigurationBuilder 中添加了一个字典,并将其添加到 InMemoryCollection 中。

    #nullable enable
private IConfiguration _config;
void Main()
{   
    var builder = new ConfigurationBuilder();
    var dictonary = new Dictionary<string, string>
    {
        {"Authentication:SecretKey","SuperSecret"}
    };
    builder.AddInMemoryCollection(dictonary);
    
    _config = builder.Build();
    
    _config.GetValue<string>("Authentication:SecretKey").Dump();
}

示例


是的,但这不是问题所在。恐怕堆栈溢出不是一个随机程序员技巧的集合。 - JHBonarius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接