Pertanyaan Cara mensimulasikan ConfigurationManager di LINQPad


Saya mencoba menguji beberapa kode di LINQPad. Namun, itu base kelas memanggil Manajer Konfigurasi. Bagaimana saya bisa mensimulasikan itu ketika menguji di 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")
    {            
    }
}

Berikut adalah konstruktor untuk BaseRepository (dari DLL terkompilasi, sehingga tidak dapat diedit di LINQPad):

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

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

5
2017-09-29 13:50


asal


Jawaban:


Jawabannya dapat ditemukan di situs web LINQPad FAQ

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

Saya mereferensikan rakitan khusus yang membaca pengaturan dari file konfigurasi aplikasi (app.config). Di mana saya harus meletakkan file konfigurasi aplikasi saya sehingga pertanyaan LINQPad akan mengambilnya?

Buat file bernama linqpad.config di folder yang sama dengan LINQPad.exe dan masukkan data konfigurasi Anda di sana. Jangan bingung dengan linqpad.exe.config ini:

• linqpad.exe.config adalah untuk LINQPad GUI

• linqpad.config adalah untuk pertanyaan Anda.


10
2017-09-29 13:55



Sesuatu yang mungkin berguna untuk Anda, saya membuatnya beberapa waktu lalu.

Ini adalah metode ekstensi, yang dapat Anda gunakan untuk memaksa memuat ulang konfigurasi dari file tertentu. Ini menggunakan refleksi untuk mengubah bidang pribadi di manajer, membersihkan konfigurasi dan kemudian secara kondisional memuatnya kembali. Jauh lebih mudah daripada mengedit file konfigurasi LINQPad secara manual.

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;
    }
}

Contoh penggunaan:

typeof(SomeType).ForceNewConfigFile();

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

SomeType hanya tipe yang terdapat dalam assembly, yang akan digunakan sebagai sumber untuk lokasi file konfigurasi. Asumsi adalah: file konfigurasi ada di samping file DLL dan diberi nama {Assembly.Location}.config.


2
2017-09-29 14:41