2015-03-29 7 views
-2

Я пытаюсь понять статические классы в C#. Вещь, которую я хочу сделать, это то, что я хочу создать статический класс конфигурации. В котором я собираюсь определить несколько открытых элементов, которые могут быть доступны извне, например ConnectionString и другую конфигурацию, связанную с приложением. Как это сделать?Публичные элементы в статическом классе C#

public static class config { 
    public static string con {get; set;} 
    public static bool IsProduction {get; set;} 
    public static string FileLogPath {get; set;} 
} 

Это то, что я делаю сейчас, мне нужно определить все значения переменной в конструкторе или нет?

+0

У вас есть класс на месте, где код, задающий значения для этого класса, вы должны поместить этот код в приложение, чтобы вы могли получить доступ к нему через application – Saravanan

+0

Существует не так много кода, только нужно извлекать значения из web.config и присваивать их переменным. – Ancient

+0

Я знаю, что могу напрямую получать значения из webconfig, но я сделал отдельный проект для конфигурации и добавил ссылку на сайт этого проекта. поэтому я так делаю – Ancient

ответ

3

Обычно это лучше обрабатывается с помощью одноэлементного рисунка. Исключения в статическом конструкторе - кошмар +, когда вы используете одноэлементный шаблон, ваш объект всегда находится в состоянии согласованности, и инициализация выполняется по запросу для первого вызова Config.Instance.

public class Config { 
    private static Config s_Config; 

    public static Config Instance { 
    get { 
     if (s_Config == null) 
     { 
     // fetch members 
     string con = ""; 
     bool isProduction = false; 
     string fileLogPath = ""; 
     s_Config = new Config(con, isProduction, fileLogPath); 
     } 
     return s_Config; 
    } 
    } 

    private Config(string con, bool isProduction, string fileLogPath) 
    { 
    Con = con; 
    IsProduction = isProduction; 
    FileLogPath = fileLogPath; 
    } 

    public string Con { get; private set; } 
    public bool IsProduction { get; private set; } 
    public string FileLogPath { get; private set; } 
} 

Как отмечено @khlr - это простой пример, и часть инициализации Singleton не является потокобезопасной. Если проблема с потоками связана с проблемой https://msdn.microsoft.com/en-us/library/ff650316.aspx

+0

вы можете объяснить сэр? – Ancient

+0

@ Древний, если вы _really_ хотите использовать синглтон для этой цели, чем лучше для него «лучше», используя [этот образец формы MSDN] (https://msdn.microsoft.com/en-us/library/ff650316.aspx?f = 255 & MSPPError = -2147217396) с двойной блокировкой. И дополнительно [помните об этом] (http://blogs.msdn.com/b/scottdensmore/archive/2004/05/25/140827.aspx). – khlr