Saya mencoba menerapkan bagian konfigurasi khusus dalam suatu proyek dan saya terus berlari melawan pengecualian yang tidak saya mengerti. Saya berharap seseorang dapat mengisi bagian yang kosong di sini.
Saya memiliki App.config
yang terlihat seperti ini:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="ServicesSection" type="RT.Core.Config.ServicesConfigurationSectionHandler, RT.Core"/>
</configSections>
<ServicesSection type="RT.Core.Config.ServicesSection, RT.Core">
<Services>
<AddService Port="6996" ReportType="File" />
<AddService Port="7001" ReportType="Other" />
</Services>
</ServicesSection>
</configuration>
Saya memiliki ServiceConfig
elemen yang didefinisikan seperti ini:
public class ServiceConfig : ConfigurationElement
{
public ServiceConfig() {}
public ServiceConfig(int port, string reportType)
{
Port = port;
ReportType = reportType;
}
[ConfigurationProperty("Port", DefaultValue = 0, IsRequired = true, IsKey = true)]
public int Port
{
get { return (int) this["Port"]; }
set { this["Port"] = value; }
}
[ConfigurationProperty("ReportType", DefaultValue = "File", IsRequired = true, IsKey = false)]
public string ReportType
{
get { return (string) this["ReportType"]; }
set { this["ReportType"] = value; }
}
}
Dan saya memiliki ServiceCollection
definisi seperti:
public class ServiceCollection : ConfigurationElementCollection
{
public ServiceCollection()
{
Console.WriteLine("ServiceCollection Constructor");
}
public ServiceConfig this[int index]
{
get { return (ServiceConfig)BaseGet(index); }
set
{
if (BaseGet(index) != null)
{
BaseRemoveAt(index);
}
BaseAdd(index, value);
}
}
public void Add(ServiceConfig serviceConfig)
{
BaseAdd(serviceConfig);
}
public void Clear()
{
BaseClear();
}
protected override ConfigurationElement CreateNewElement()
{
return new ServiceConfig();
}
protected override object GetElementKey(ConfigurationElement element)
{
return ((ServiceConfig) element).Port;
}
public void Remove(ServiceConfig serviceConfig)
{
BaseRemove(serviceConfig.Port);
}
public void RemoveAt(int index)
{
BaseRemoveAt(index);
}
public void Remove(string name)
{
BaseRemove(name);
}
}
Bagian yang saya lewatkan adalah apa yang harus dilakukan untuk pawang. Awalnya, saya mencoba menerapkan IConfigurationSectionHandler
tetapi menemukan dua hal:
- tidak berhasil
- sudah usang.
Saya benar-benar bingung sekarang tentang apa yang harus dilakukan sehingga saya dapat membaca data saya dari konfigurasi. Tolong bantu!
c#
configuration
app-config
configuration-files
Chris Holmes
sumber
sumber
Jawaban:
Jawaban sebelumnya benar tetapi saya akan memberikan semua kode juga.
App.config Anda akan terlihat seperti ini:
Kelas Anda
ServiceConfig
danServiceCollection
tetap tidak berubah.Anda membutuhkan kelas baru:
Dan itu harus melakukan trik. Untuk mengkonsumsinya Anda dapat menggunakan:
sumber
[Add|Remove|Clear]ItemName
properti diConfigurationCollection
atribut tidak benar-benar diperlukan dalam kasus ini, karena "menambahkan" / "jelas" / "menghapus" sudah nama-nama default dari elemen XML.Jika Anda mencari bagian konfigurasi khusus seperti berikut
maka Anda dapat menggunakan implementasi saya pada bagian konfigurasi sehingga untuk memulai menambahkan
System.Configuration
referensi perakitan ke proyek AndaLihatlah setiap elemen bersarang yang saya gunakan, Yang pertama adalah Kredensial dengan dua atribut jadi mari kita tambahkan dulu
Elemen Kredensial
PrimaryAgent dan SecondaryAgent
Keduanya memiliki atribut yang sama dan tampak seperti Alamat untuk satu set server untuk primer dan failover, jadi Anda hanya perlu membuat satu elemen kelas untuk keduanya seperti mengikuti
Saya akan menjelaskan cara menggunakan dua elemen yang berbeda dengan satu kelas nanti dalam posting ini, mari kita lewati SiteId karena tidak ada perbedaan di dalamnya. Anda hanya perlu membuat satu kelas yang sama seperti di atas dengan satu properti saja. mari kita lihat bagaimana cara mengimplementasikan koleksi Lanes
itu dibagi dalam dua bagian pertama Anda harus membuat kelas implementasi elemen kemudian Anda harus membuat kelas elemen koleksi
LaneConfigElement
Anda dapat melihat bahwa salah satu atribut
LanElement
adalah Pencacahan dan jika Anda mencoba menggunakan nilai lain dalam konfigurasi yang tidak didefinisikan dalam aplikasi Pencacahan akan melemparSystem.Configuration.ConfigurationErrorsException
pada startup. Ok mari kita beralih ke Definisi KoleksiAnda dapat melihat bahwa saya telah menetapkan
AddItemName = "Lane"
Anda dapat memilih apa pun yang Anda suka untuk item entri koleksi Anda, saya lebih suka menggunakan "tambahkan" yang default tetapi saya mengubahnya hanya untuk kepentingan posting ini.Sekarang semua Elemen bersarang kami telah diimplementasikan sekarang kami harus mengumpulkan semua yang ada di kelas yang harus diimplementasikan
System.Configuration.ConfigurationSection
CustomApplicationConfigSection
Sekarang Anda dapat melihat bahwa kami memiliki dua properti dengan nama
PrimaryAgent
danSecondaryAgent
keduanya memiliki tipe yang sama sekarang Anda dapat dengan mudah memahami mengapa kami hanya memiliki satu kelas implementasi terhadap kedua elemen ini.Sebelum Anda dapat menggunakan bagian konfigurasi yang baru ditemukan ini di app.config (atau web.config), Anda hanya perlu memberi tahu aplikasi bahwa Anda telah menemukan bagian konfigurasi Anda sendiri dan memberikan rasa hormat, untuk melakukannya Anda harus menambahkan baris berikut di app.config (mungkin tepat setelah awal tag root).
CATATAN: MyAssemblyName harus tanpa .dll misalnya jika Anda nama file assembly adalah myDll.dll kemudian gunakan myDll bukan myDll.dll
untuk mengambil konfigurasi ini gunakan baris kode berikut di mana saja di aplikasi Anda
Saya harap posting di atas akan membantu Anda memulai dengan bagian konfigurasi kustom yang agak rumit.
Selamat Coding :)
**** Edit **** Untuk Mengaktifkan LINQ,
LaneConfigCollection
Anda harus menerapkanIEnumerable<LaneConfigElement>
Dan Tambah implementasi berikut dari
GetEnumerator
untuk orang-orang yang masih bingung tentang bagaimana hasil benar-benar bekerja, baca artikel yang bagus ini
Dua poin utama yang diambil dari artikel di atas adalah
sumber
Ini adalah kode umum untuk koleksi konfigurasi:
Setelah melakukannya
GenericConfigurationElementCollection
, Anda dapat menggunakannya secara sederhana di bagian konfigurasi (ini adalah contoh dari Dispatcher saya):Elemen Config adalah config Di Sini:
File konfigurasi akan terlihat seperti ini:
Semoga ini bisa membantu!
sumber
Alternatif yang lebih mudah bagi mereka yang lebih suka untuk tidak menulis semua konfigurasi boilerplate secara manual ...
1) Instal Nerdle.AutoConfig dari NuGet
2) Tentukan tipe ServiceConfig Anda (baik kelas beton atau hanya antarmuka, baik akan dilakukan)
3) Anda memerlukan tipe untuk menyimpan koleksi, mis
4) Tambahkan bagian konfigurasi seperti ini (perhatikan penamaan camelCase)
5) Peta dengan Konfigurasi Otomatis
sumber
Cobalah mewarisi dari ConfigurationSection . Posting blog ini oleh Phil Haack memiliki contoh.
Dikonfirmasi, sesuai dokumentasi untuk IConfigurationSectionHandler :
sumber