Глобальная переменная подход в приложении C # Windows Forms? (публичный статический класс GlobalData лучший) - PullRequest
1 голос
/ 04 октября 2009

Я хочу, чтобы в моем приложении C # Windows Forms была доступна некоторая пользовательская конфигурация (считанная из файла).

Является ли понятие сказать:

  1. создание статического класса, например "открытый статический класс GlobalData"
  2. загрузка из действия «Загрузить» основного события формы

Как это звучит? Это лучший способ сделать это?

Ответы [ 5 ]

2 голосов
/ 04 октября 2009

Как уже говорили другие, вы можете использовать AppSettings для хранения простых данных. Основы просты; выход за их пределы затруднен (см. разделы App.Config и Custom Configuration ). Вы также можете сериализовать классы в XML или JSON , писать собственные форматы хранения, использовать базы данных и т. Д.

Обеспечение доступности конфигурации в вашем приложении - это отдельная проблема. Статические классы и синглтоны по своей природе трудны для тестирования , и вводят сцепление во всех других ваших классах. Один из вариантов - создать интерфейс для вашего класса данных конфигурации, создать и загрузить конфигурацию при запуске, а затем передать interface любому классу, который в этом нуждается (часто в качестве параметра конструктора). Это называется Внедрение зависимостей .

Если вы делаете это много, есть библиотеки, которые помогут вам (после того, как вы пройдете обучение). См. Список контейнеров внедрения зависимостей .NET (IOC) .

1 голос
/ 04 октября 2009

Я использую файл настроек по умолчанию для простых значений, таких как расположение и размеры окон. Это приятно, потому что настройки собраны в свойства для вас. Вы можете реализовать другие настройки так, как вам нравится.

Я не очень часто использую файлы настроек приложения в Windows Forms. Я использовал их все время в ASP.NET. Иногда я храню информацию в DataTables в памяти и использую функции DataTable.Load и WriteXml для сохранения информации.

Что касается глобального доступа, в Windows Forms я добавляю класс Component в проект и создаю глобальный статический экземпляр в Main. Затем я могу ссылаться на экземпляр из всех форм и добавить глобальные данные к этому компоненту. Данные предоставляются в виде свойств или с помощью функций.

1 голос
/ 04 октября 2009

Я бы не стал использовать статический класс 'GlobalData', так как он похож на универсальный класс универсального типа Utils, который может в конечном итоге стать местом сброса мусора для всех видов мусора. Я бы больше склонялся к использованию настроек Windows Forms (будь то настройки пользователя или приложения) для хранения информации о моей конфигурации. Затем ваши данные конфигурации могут быть получены из любого места в вашем проекте Winforms, используя Properties.Settings.Default.MySetting.

С учетом сказанного есть некоторые вещи, которые я могу сохранить в статическом классе. Например, у меня есть статический объект SqlDBConnectionInfo, содержащий мой сервер, базу данных и учетные данные, которые можно использовать для создания объекта Sql Connection или для выполнения операций резервного копирования / восстановления SMO. Этот статический объект создается при входе в систему, и любой другой класс, который каким-то образом должен работать с базой данных SQL, может получить статический объект.

Редактировать: Еще одна возможность - если вы десериализуете / сериализуете свои данные конфигурации с использованием класса экземпляра, вы можете создать статическое свойство в вашем Program.cs, которое будет содержать экземпляр вашего десериализованного объекта конфигурации. , Затем другие классы в вашем проекте могут ссылаться на ваши данные конфигурации, используя: MyProjectName.MyConfigurationObject.

1 голос
/ 04 октября 2009

Поиск ConfigurationManager.AppSettings.

Пример кода на http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.appsettings.aspx

0 голосов
/ 26 марта 2016

Выполните следующие шаги для сохранения глобальных данных:

  1. Создать статический класс для хранения данных:

статический класс Globals { статическое строковое имя; статическая строка электронной почты;

    public static String Name
    {
        get { return Globals.name; }
        set { Globals.name = value; }
    }

    public static String Email
    {
        get { return Globals.email; }
        set { Globals.email = value; }
    }

}
  1. Если у вас есть страница входа, заполните, например, статический класс, в противном случае вы можете заполнить статический глобальный класс где угодно в соответствии с вашими требованиями.

    private void btnLogin_Click(object sender, EventArgs e)
    {
    
        if (!validate())
            return;
    
        // for admin
        if (txtUserName.Text == "a" && txtPassword.Text == "a")
        {
            this.Hide();
            Globals.Email = txtUserName.Text;
            Globals.IsAdmin = true;
            Globals.Password = txtPassword.Text;
    
            // show other form
            FrmMain frmmain = new FrmMain();
            frmmain.ShowDialog();
    
            // close application
            //this.Close();
    
        }
    
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...