2011-08-25 30 views
5

Tôi muốn sử dụng ConfigurationManager để truy cập một số giá trị chuỗi từ lớp tĩnh tĩnh. Tuy nhiên, tôi cần phải xử lý cụ thể sự vắng mặt của một giá trị hoặc sự hiện diện của các giá trị rỗng. Hiện tại tôi đã sử dụng trình khởi tạo kiểu, nhưConfigurationManager & Static Class

để thực hiện công việc. Tuy nhiên, nếu chuỗi có khóa "abc" không tồn tại trong App.config, việc thực thi sẽ tiếp tục với tham chiếu null thay cho số someStr. Vậy thì, cách tốt nhất để xác thực giá trị này khi khởi tạo là gì? Một hàm tạo tĩnh trong đó tôi khởi tạo giá trị và sau đó kiểm tra tính hợp lệ? Tôi nghe nói các nhà xây dựng tĩnh là để tránh và thay thế bằng loại initializers khi có thể.

Trả lời

6

Tôi đang sử dụng một cái gì đó như thế này:

public static readonly string someStr = 
     ConfigurationManager.AppSettings["abc"] ?? "default value"; 

Hoặc để xử lý chuỗi rỗng:

public static readonly string someStr = 
      !String.IsNullOrEmpty(ConfigurationManager.AppSettings["abc"]) ? 
          ConfigurationManager.AppSettings["abc"] : "default value"; 
2

constructor tĩnh cũng tốt, những điều tuyệt vời về họ là họ đang đảm bảo bởi thời gian chạy được thực hiện một lần và một lần duy nhất - lần đầu tiên lớp được sử dụng trong mọi trường hợp.

Hoặc bạn có thể sử dụng toán tử liên hiệp (??) để thiết lập một giá trị mặc định:

private static readonly string someStr = ConfigurationManager.AppSettings["abc"] ?? "some default value"; 
4

này chỉ đưa ra trong một bài đánh giá mã. Các câu trả lời được cung cấp là tuyệt vời cho chuỗi. Nhưng họ không làm việc cho một int hoặc một đôi, vv ... Hôm nay, tôi cần phải làm điều này cho một số thử lại và nó cần phải là một int.

Vì vậy, đây là câu trả lời cho những người muốn bao gồm chuyển đổi Loại.

Sử dụng phương pháp mở rộng này:

using System.Collections.Specialized; 
using System.ComponentModel; 

namespace Rhyous.Config.Extensions 
{ 
    public static class NameValueCollectionExtensions 
    { 
     public static T Get<T>(this NameValueCollection collection, string key, T defaultValue) 
     { 
      var value = collection[key]; 
      var converter = TypeDescriptor.GetConverter(typeof(T)); 
      if (string.IsNullOrWhiteSpace(value) || !converter.IsValid(value)) 
      { 
       return defaultValue; 
      } 

      return (T)(converter.ConvertFromInvariantString(value)); 
     } 
    } 
} 

Tôi cũng có các unit test cho nó, mà bạn có thể tìm thấy ở đây: http://www.rhyous.com/2015/12/02/how-to-easily-access-a-web-config-appsettings-value-with-a-type-and-a-default-value

Hy vọng rằng sẽ giúp các chàng bên cạnh.

+0

Điều này hiện có trong gói Rhyous.Collections NuGet của tôi và bạn có thể xem nguồn trên GitHub: https://github.com/rhyous/Collections/blob/master/src/Rhyous.Collections/Extensions/NameValueCollectionExtensions.cs – Rhyous