2010-11-18 8 views
7

Tôi đang tìm hiểu về cách sử dụng các tệp cấu hình và tôi gặp phải một số vấn đề mà tôi hy vọng ai đó ở đây có thể cho tôi một số lời khuyên. Nó không quan trọng nếu các tập tin của tôi là XML hay không, nhưng phần lớn các ví dụ tôi đã đọc đang sử dụng chúng và Im tất cả cho bất cứ điều gì mà làm cho cuộc sống của tôi dễ dàng hơn.Sử dụng nhiều giá trị cho một khóa trong appSettings

vấn đề Im chạy vào đó là tập tin appSettings dường như được thiết lập để chỉ chấp nhận một giá trị cho một chìa khóa và tôi muốn có một cái gì đó tương tự như:

<key="Machine List" value="Server105" /> 
<key="Machine List" value="Server230" /> 

Ive tìm thấy một hack here nhưng nó đã được viết hơn 6 năm trước và tôi không biết liệu có cách nào tốt hơn không.

Một lần nữa, nó không quan trọng nếu đây là XML, tệp phẳng, v.v. Im chỉ cố gắng tìm hiểu cách sử dụng tệp cấu hình thay vì giá trị mã hóa cứng trực tiếp vào ứng dụng.

Cảm ơn sự giúp đỡ của bạn.

+1

nhưng điều đó rất ít ý nghĩa. tại sao bạn cần điều đó? –

+2

Làm thế nào để làm cho "cảm giác nhỏ"? Đôi khi bạn cần một danh sách các giá trị. –

+0

@MitchWheat Một ví dụ sẽ là danh sách các địa chỉ email. Nó dễ dàng hơn để có một dòng cho mỗi địa chỉ thay vì phân tách chúng bằng ';' hoặc ',', phân tích các giá trị, v.v. Nó cũng dễ dàng hơn để nhận xét một mục duy nhất hơn là định vị nó trong cấu hình và xóa nó hoàn toàn. – Yuck

Trả lời

10

nếu bạn thực sự cần phải lưu trữ nhiều máy tính dưới sự chủ chốt, nó sẽ là thích hợp hơn để làm:

<key="Machine List" value="Server105,Server230" /> 

với delimiter là một nhân vật mà bạn chọn.

10

Một thay thế cho các thuộc tính nhập sẽ có thêm nút con đến nút thiết lập của bạn:

<setting key="Machine List"> 
    <value>Server105</value> 
    <value>Server230</value> 
    </setting> 

Bằng cách này bạn không cần thao tác chuỗi để trích xuất các giá trị khác nhau.

+0

Đó là một giải pháp thú vị, nhưng bằng cách sử dụng chức năng appSettings được xây dựng, xml này sẽ không được chọn sẽ không? –

+0

@Jeremy B .: thực sự. Các appSettings xml phải chứa các khóa-giá trị trong đó các giá trị là các chuỗi. Tuy nhiên, MS đã lỗi thời appSettings, và khuyên sử dụng ConfigurationManager để thay thế. http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.aspx. – xtofl

+0

Cảm ơn thông tin, tôi sẽ nhớ rằng lần sau tôi cần một cái gì đó như thế này, tôi thích nó tốt hơn so với thao tác chuỗi. –

1

Bạn có thể sử dụng các phần cấu hình nơi bạn có thể xác định cấu hình của riêng mình. Chỉ cần thêm

<configSections> 
    <sectionGroup name="MyConfiguration"> 
    <section name="MyQuery" type="namespace.QueryConfigurationSection" allowLocation="true" allowDefinition="Everywhere"/> 
    </sectionGroup> 
</configSections> 

sau <configuration> và bạn có thể thêm phần tùy chỉnh của bạn ngay sau khi appsetting

</appSettings> 
<!-- custom query configuration --> 
<MyConfiguration> 
<MyQuery>  
    <Query1> </Query1> 
    <Query2> </Query2> 

Để đọc bạn cần phải tạo ra một vài lớp

/// <summary> 
/// Creates a custom configuration section inside web.config 
/// </summary> 
public class QueryConfigurationSection : ConfigurationSection 
{ 
    //query 2 
    [ConfigurationProperty("Query1")] 
    public QueryElement1 Query1 
    { 
     get { return this["Query1"] as QueryElement1; } 
    } 

    //query 2 
    [ConfigurationProperty("Query2")] 
    public QueryElement2 Query2 
    { 
     get { return this["Query2"] as QueryElement2; } 
    } 
} 


public class QueryElement1 : ConfigurationElement 
{ 
    public string Value { get; private set; } 
    protected override void DeserializeElement(XmlReader reader, bool s) 
    { 
     Value = reader.ReadElementContentAs(typeof(string), null) as string; 
    }   
} 


public class QueryElement2 : ConfigurationElement 
{ 
    public string Value { get; private set; } 
    protected override void DeserializeElement(XmlReader reader, bool s) 
    { 
     Value = reader.ReadElementContentAs(typeof(string), null) as string; 
    } 
} 

Các DeserializedElement ghi đè sẽ deserialize Xml (bên trong) QueryElement1 & 2.

Để đọc các giá trị từ ứng dụng chính, bạn chỉ cần gọi những điều sau:

//calling my query config 
QueryConfigurationSection wconfig = (QueryConfigurationSection)ConfigurationManager.GetSection("MyConfiguration/MyQuery"); 
string _query1 = wconfig.Query1.Value; 
string _query2 = wconfig.Query2.Value; 
1

Có lẽ bạn nên suy nghĩ lại về thiết kế của mình. Tôi sẽ chỉ đưa danh sách bạn muốn vào một tệp khác chứ không phải cấu hình. Bạn có thể làm một chuỗi phân cách nhưng sau đó nếu danh sách đã lâu, sẽ rất khó để quản lý nó. Bạn có thể đặt nó vào một tệp văn bản hoặc một tệp XML/JSON. Đây là một số mã có thể là một nơi tốt để bắt đầu.

public static class MyClass 
    { 
     private static string _path = ConfigurationManager.AppSettings["FilePath"]; 
     private static List<string> _list; 

     static MyClass() 
     { 
      _list = new List<string>(); 
      foreach (string l in File.ReadAllLines(_path)) 
       _list.Add(l); 
     } 
     public static List<string> GetList() 
     { 
      return _list; 
     } 
    } 

Tôi đã tạo một lớp tĩnh nên chỉ đọc từ tệp một lần và không phải lúc nào bạn cũng cần lấy thông tin từ tệp đó.

Điều này cũng có thể là một điều tốt để đưa vào cơ sở dữ liệu nếu bạn cần thêm chức năng. Nhưng đối với một loại nhỏ chỉ đọc điều, điều này sẽ làm việc tốt hơn so với một chuỗi phân định cho các giá trị dài hơn.