Jika Anda mencari bagian konfigurasi khusus seperti berikut
<CustomApplicationConfig>
<Credentials Username="itsme" Password="mypassword"/>
<PrimaryAgent Address="10.5.64.26" Port="3560"/>
<SecondaryAgent Address="10.5.64.7" Port="3570"/>
<Site Id="123" />
<Lanes>
<Lane Id="1" PointId="north" Direction="Entry"/>
<Lane Id="2" PointId="south" Direction="Exit"/>
</Lanes>
</CustomApplicationConfig>
maka Anda dapat menggunakan implementasi saya pada bagian konfigurasi sehingga untuk memulai menambahkan System.Configuration
referensi perakitan ke proyek Anda
Lihatlah setiap elemen bersarang yang saya gunakan, Yang pertama adalah Kredensial dengan dua atribut jadi mari kita tambahkan dulu
Elemen Kredensial
public class CredentialsConfigElement : System.Configuration.ConfigurationElement
{
[ConfigurationProperty("Username")]
public string Username
{
get
{
return base["Username"] as string;
}
}
[ConfigurationProperty("Password")]
public string Password
{
get
{
return base["Password"] as string;
}
}
}
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
public class ServerInfoConfigElement : ConfigurationElement
{
[ConfigurationProperty("Address")]
public string Address
{
get
{
return base["Address"] as string;
}
}
[ConfigurationProperty("Port")]
public int? Port
{
get
{
return base["Port"] as int?;
}
}
}
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
public class LaneConfigElement : ConfigurationElement
{
[ConfigurationProperty("Id")]
public string Id
{
get
{
return base["Id"] as string;
}
}
[ConfigurationProperty("PointId")]
public string PointId
{
get
{
return base["PointId"] as string;
}
}
[ConfigurationProperty("Direction")]
public Direction? Direction
{
get
{
return base["Direction"] as Direction?;
}
}
}
public enum Direction
{
Entry,
Exit
}
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 melempar System.Configuration.ConfigurationErrorsException
pada startup. Ok mari kita beralih ke Definisi Koleksi
[ConfigurationCollection(typeof(LaneConfigElement), AddItemName = "Lane", CollectionType = ConfigurationElementCollectionType.BasicMap)]
public class LaneConfigCollection : ConfigurationElementCollection
{
public LaneConfigElement this[int index]
{
get { return (LaneConfigElement)BaseGet(index); }
set
{
if (BaseGet(index) != null)
{
BaseRemoveAt(index);
}
BaseAdd(index, value);
}
}
public void Add(LaneConfigElement serviceConfig)
{
BaseAdd(serviceConfig);
}
public void Clear()
{
BaseClear();
}
protected override ConfigurationElement CreateNewElement()
{
return new LaneConfigElement();
}
protected override object GetElementKey(ConfigurationElement element)
{
return ((LaneConfigElement)element).Id;
}
public void Remove(LaneConfigElement serviceConfig)
{
BaseRemove(serviceConfig.Id);
}
public void RemoveAt(int index)
{
BaseRemoveAt(index);
}
public void Remove(String name)
{
BaseRemove(name);
}
}
Anda 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
public class CustomApplicationConfigSection : System.Configuration.ConfigurationSection
{
private static readonly ILog log = LogManager.GetLogger(typeof(CustomApplicationConfigSection));
public const string SECTION_NAME = "CustomApplicationConfig";
[ConfigurationProperty("Credentials")]
public CredentialsConfigElement Credentials
{
get
{
return base["Credentials"] as CredentialsConfigElement;
}
}
[ConfigurationProperty("PrimaryAgent")]
public ServerInfoConfigElement PrimaryAgent
{
get
{
return base["PrimaryAgent"] as ServerInfoConfigElement;
}
}
[ConfigurationProperty("SecondaryAgent")]
public ServerInfoConfigElement SecondaryAgent
{
get
{
return base["SecondaryAgent"] as ServerInfoConfigElement;
}
}
[ConfigurationProperty("Site")]
public SiteConfigElement Site
{
get
{
return base["Site"] as SiteConfigElement;
}
}
[ConfigurationProperty("Lanes")]
public LaneConfigCollection Lanes
{
get { return base["Lanes"] as LaneConfigCollection; }
}
}
Sekarang Anda dapat melihat bahwa kami memiliki dua properti dengan nama PrimaryAgent
dan SecondaryAgent
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).
<configSections>
<section name="CustomApplicationConfig" type="MyNameSpace.CustomApplicationConfigSection, MyAssemblyName" />
</configSections>
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
CustomApplicationConfigSection config = System.Configuration.ConfigurationManager.GetSection(CustomApplicationConfigSection.SECTION_NAME) as CustomApplicationConfigSection;
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
public new IEnumerator<LaneConfigElement> GetEnumerator()
{
int count = base.Count;
for (int i = 0; i < count; i++)
{
yield return base.BaseGet(i) as LaneConfigElement;
}
}
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
itu tidak benar-benar mengakhiri eksekusi metode. imbal hasil menjeda eksekusi metode dan pada saat Anda memanggilnya (untuk nilai enumerasi berikutnya), metode akan terus dieksekusi dari panggilan pengembalian imbuhan terakhir. Kedengarannya agak membingungkan saya pikir ... (Shay Friedman)
Hasil bukan fitur runtime .Net. Ini hanya fitur bahasa C # yang dikompilasi menjadi kode IL sederhana oleh kompiler C #. (Lars Corneliussen)