Aşağıdaki gibi özel bir yapılandırma bölümü arıyorsanız
<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>
System.Configuration
projenize montaj referansı eklemek için yapılandırma bölümü uygulamamı kullanabilirsiniz .
Kullandığım her iç içe öğeye bakın, İlki iki özniteliğe sahip Kimlik Bilgileri'dir, bu yüzden önce eklemenizi sağlar
Kimlik Bilgileri Öğesi
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 ve SekonderAgent
Her ikisi de aynı özelliklere sahiptir ve birincil ve yük devretme için bir dizi sunucuya Adres gibi görünür, bu nedenle aşağıdakiler gibi her ikisi için de bir öğe sınıfı oluşturmanız gerekir
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?;
}
}
}
Bu yazının ilerleyen bölümlerinde bir sınıfla iki farklı öğenin nasıl kullanılacağını açıklayacağım, hiçbir fark olmadığı için SiteId'i atlayalım. Sadece tek bir özellik ile yukarıdakiyle aynı bir sınıf oluşturmanız yeterlidir. Şerit koleksiyonunun nasıl uygulanacağını görelim
önce bir öğe uygulama sınıfı oluşturmak zorunda sonra iki bölüme ayrılır sonra koleksiyon öğesi sınıfı oluşturmak zorunda
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
}
bir özniteliğinin LanElement
bir Numaralandırma olduğunu ve Numaralandırma uygulamasında tanımlanmayan yapılandırmada başka bir değer kullanmaya çalışırsanız System.Configuration.ConfigurationErrorsException
başlangıçta bir hata atacaktır . Tamam, Koleksiyon Tanımlamasına geçelim
[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);
}
}
Eğer ben belirledik fark edebilirsiniz AddItemName = "Lane"
sen i kullandığınız varsayılan bir "add" tercih koleksiyonunuzu giriş öğe için gibi ne olursa olsun sizi seçebilir ama ben sadece bu yazı uğruna değiştirdi.
Şimdi tüm iç içe Elemanlarımız uygulandı şimdi uygulamak zorunda olan bir sınıftaki tüm öğeleri toplamalıyız 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; }
}
}
Şimdi, isimle iki özelliğe sahip olduğumuzu PrimaryAgent
ve SecondaryAgent
her ikisinin de aynı türe sahip olduğunu görebilirsiniz.
App.config (veya web.config) dosyasında bu yeni icat edilen yapılandırma bölümünü kullanabilmeniz için, uygulamaya kendi yapılandırma bölümünüzü icat ettiğinizi söylemeniz ve biraz saygı göstermeniz gerekir, bunun için aşağıdaki satırları eklemeniz gerekir app.config dosyasında (root etiketinin başlamasından hemen sonra olabilir).
<configSections>
<section name="CustomApplicationConfig" type="MyNameSpace.CustomApplicationConfigSection, MyAssemblyName" />
</configSections>
NOT: Montaj dosya adı myDll.dll ise MyAssemblyName .dll olmadan olmalıdır sonra myDll.dll yerine myDll kullanın
Bu yapılandırmayı almak için uygulamanızın herhangi bir yerinde aşağıdaki kod satırını kullanın
CustomApplicationConfigSection config = System.Configuration.ConfigurationManager.GetSection(CustomApplicationConfigSection.SECTION_NAME) as CustomApplicationConfigSection;
Umarım yukarıdaki yazı, biraz karmaşık özel yapılandırma bölümlerine başlamanıza yardımcı olur.
Mutlu Kodlama :)
**** Edit **** Üzerinde LINQ etkinleştirmek LaneConfigCollection
için uygulamak zorundaIEnumerable<LaneConfigElement>
Ve aşağıdaki uygulamasını ekleyin GetEnumerator
public new IEnumerator<LaneConfigElement> GetEnumerator()
{
int count = base.Count;
for (int i = 0; i < count; i++)
{
yield return base.BaseGet(i) as LaneConfigElement;
}
}
hala verimin gerçekten nasıl çalıştığı konusunda kafası karışmış insanlar için bu güzel makaleyi okuyun
Yukarıdaki makaleden alınan iki kilit nokta:
yöntemin yürütülmesini gerçekten sonlandırmaz. verim dönüşü yöntem yürütmesini duraklatır ve bir sonraki çağırışınızda (sonraki numaralandırma değeri için), yöntem son verim dönüş çağrısından yürütmeye devam eder. Sanırım biraz kafa karıştırıcı geliyor… (Shay Friedman)
Getiri .Net çalışma zamanının bir özelliği değildir. C # derleyicisi tarafından basit IL koduna derlenen sadece bir C # dili özelliğidir. (Lars Corneliussen)