Nếu bạn đang tìm kiếm một phần cấu hình tùy chỉnh như sau
<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>
sau đó bạn có thể sử dụng phần triển khai cấu hình của tôi để bắt đầu thêm System.Configuration
tham chiếu lắp ráp vào dự án của bạn
Nhìn vào từng yếu tố lồng nhau mà tôi đã sử dụng, Đầu tiên là Thông tin xác thực với hai thuộc tính vì vậy hãy thêm nó vào trước
Yếu tố thông tin
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;
}
}
}
Tiểu học và Trung học
Cả hai đều có cùng thuộc tính và có vẻ giống như một Địa chỉ cho một bộ máy chủ cho chính và chuyển đổi dự phòng, vì vậy bạn chỉ cần tạo một lớp phần tử cho cả hai loại như sau
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?;
}
}
}
Tôi sẽ giải thích cách sử dụng hai yếu tố khác nhau với một lớp sau trong bài viết này, chúng ta hãy bỏ qua SiteId vì không có sự khác biệt trong nó. Bạn chỉ cần tạo một lớp giống như trên với một thuộc tính duy nhất. Hãy cho chúng tôi xem cách triển khai bộ sưu tập Lanes
nó được chia thành hai phần trước tiên bạn phải tạo một lớp triển khai phần tử sau đó bạn phải tạo lớp phần tử bộ sưu tập
LaneConfigEuity
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
}
bạn có thể nhận thấy rằng một thuộc tính của LanElement
là một liệt kê và nếu bạn cố gắng sử dụng bất kỳ giá trị nào khác trong cấu hình không được xác định trong ứng dụng liệt kê sẽ System.Configuration.ConfigurationErrorsException
khởi động khi khởi động. Ok hãy chuyển sang Định nghĩa Bộ sưu tập
[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);
}
}
bạn có thể nhận thấy rằng tôi đã đặt AddItemName = "Lane"
bạn có thể chọn bất cứ thứ gì bạn thích cho mục nhập bộ sưu tập của bạn, tôi thích sử dụng "thêm" mặc định nhưng tôi đã thay đổi nó chỉ vì mục đích của bài đăng này.
Bây giờ tất cả các phần tử lồng nhau của chúng ta đã được triển khai, chúng ta nên tổng hợp tất cả các phần tử trong một lớp phải thực hiện 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; }
}
}
Bây giờ bạn có thể thấy rằng chúng ta có hai thuộc tính có tên PrimaryAgent
và SecondaryAgent
cả hai đều có cùng loại bây giờ bạn có thể dễ dàng hiểu tại sao chúng ta chỉ có một lớp thực hiện chống lại hai phần tử này.
Trước khi bạn có thể sử dụng phần cấu hình mới được phát minh này trong app.config (hoặc web.config), bạn chỉ cần cho ứng dụng biết rằng bạn đã phát minh ra phần cấu hình của riêng bạn và tôn trọng nó, để bạn phải thêm các dòng sau trong app.config (có thể ngay sau khi bắt đầu thẻ gốc).
<configSections>
<section name="CustomApplicationConfig" type="MyNameSpace.CustomApplicationConfigSection, MyAssemblyName" />
</configSections>
LƯU Ý: MyAssuggingName không được có, ví dụ: nếu bạn tập hợp tên tệp là myDll.dll thì hãy sử dụng myDll thay vì myDll.dll
để lấy lại cấu hình này, hãy sử dụng dòng mã sau bất kỳ nơi nào trong ứng dụng của bạn
CustomApplicationConfigSection config = System.Configuration.ConfigurationManager.GetSection(CustomApplicationConfigSection.SECTION_NAME) as CustomApplicationConfigSection;
Tôi hy vọng bài viết trên sẽ giúp bạn bắt đầu với một loại phần cấu hình tùy chỉnh hơi phức tạp.
Chúc mừng mã hóa :)
**** Chỉnh sửa **** Để bật LINQ, LaneConfigCollection
bạn phải thực hiệnIEnumerable<LaneConfigElement>
Và thêm sau khi thực hiện GetEnumerator
public new IEnumerator<LaneConfigElement> GetEnumerator()
{
int count = base.Count;
for (int i = 0; i < count; i++)
{
yield return base.BaseGet(i) as LaneConfigElement;
}
}
Đối với những người vẫn còn bối rối về cách năng suất thực sự hoạt động, hãy đọc bài viết hay này
Hai điểm chính được lấy từ bài viết trên là
nó không thực sự kết thúc việc thực hiện phương thức. return return tạm dừng thực thi phương thức và lần sau bạn gọi nó (đối với giá trị liệt kê tiếp theo), phương thức sẽ tiếp tục thực hiện từ lệnh gọi trả lại lợi suất cuối cùng. Nghe có vẻ hơi khó hiểu Tôi nghĩ rằng (Shay Friedman)
Yield không phải là một tính năng của thời gian chạy .Net. Nó chỉ là một tính năng ngôn ngữ C # được biên dịch thành mã IL đơn giản bởi trình biên dịch C #. (Lars Corneliussen)