Вопрос дизайна для приложения Windows, лучший подход? - PullRequest
4 голосов
/ 15 мая 2010

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

Мне было интересно, как мне следует добавлять новые местоположения с течением времени, моей первой мыслью было просто жестко запрограммировать его в приложение, но это будет означать, что пользователь должен переустановить его, чтобы изменения вступили в силу.

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

Второй вариант казался лучшим подходом, но тогда мне пришлось подумать, как бы он управлялся на компьютере пользователя. В идеале я хотел бы только один .exe-файл без использования каких-либо внешних файлов, таких как XML, но это вернет меня к первому пункту.

Было бы лучше просто использовать развертывание ClickOnce, чтобы создать запись в меню «Пуск» и создать папку, содержащую .exe и имена файлов?

Спасибо за отзыв, я не хочу начинать реализацию приложения до тех пор, пока дизайн не будет завершен.

Ответы [ 3 ]

3 голосов
/ 15 мая 2010

Обычно я бы ничего не кодировал в приложении. Это делает негибкий дизайн, как вы правильно заметили.

Обычно я храню информацию о конфигурации этого типа в файле XML в папке Локальные данные приложения .

Если ваши пользователи всегда (или часто) подключены к Интернету, вы можете рассмотреть альтернативную (или дополнительную) возможность хранения такого рода информации о закладках в веб-сервисе.

EDIT:

Вот фрагмент кода, который я использовал на протяжении многих лет для такого рода вещей

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Xml.Serialization;

namespace JTools.IO.Configuration
{
    public static class ConfigManager<T> where T : new()
    {
        private const string FILENAME = "Config.xml";

        public static T Load()
        {
            return Load(ConfigFile);
        }

        public static T Load(string fileName)
        {
            T ret = default(T);

            try
            {
                // Open file to read the data from

                using (FileStream fs = new FileStream(fileName, FileMode.Open))
                {

                    // Create an XmlSerializer object to perform the deserialization
                    XmlSerializer xs = new XmlSerializer(typeof(T));

                    // Use the XmlSerializer object to deserialize the data from the file
                    ret = (T)xs.Deserialize(fs);
                }
            }
            catch (System.IO.DirectoryNotFoundException)
            {
                throw new Exception("Could not find the data directory '" + fileName + "'");
            }
            catch (System.IO.FileNotFoundException)
            {
                ret = new T();
            }

            return ret;
        }

        public static void Save(T config)
        {
            Save(config, ConfigFile);
        }

        public static void Save(T config, string fileName)
        {
            // Create file to save the data to

            using (FileStream fs = new FileStream(fileName, FileMode.Create))
            {

                // Create an XmlSerializer object to perform the serialization
                XmlSerializer xs = new XmlSerializer(typeof(T));

                // Use the XmlSerializer object to serialize the data to the file
                xs.Serialize(fs, config);
            }
        }

        static private string configFile = null;
        static public string ConfigFile
        {
            get
            {
                if (configFile == null)
                {
                    string appName = typeof(T).FullName;

                    string baseFolder = System.Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
                    string jFolder = Path.Combine(baseFolder, "JToolsConfig");
                    string dataPath = Path.Combine(jFolder, appName);

                    if (!Directory.Exists(dataPath))
                    {
                        Directory.CreateDirectory(dataPath);
                    }

                    configFile = Path.Combine(dataPath, FILENAME);
                }

                return configFile;
            }
        }

    }
}
2 голосов
/ 15 мая 2010

Подход, который я выбрал бы, это иметь класс Locations (и коллекцию), который я мог бы сериализовать в файл XML (используя XmlSerializer или DataContractSerializer).

Вы можете проверить наличие файла XML - если он существует, десериализовать его в вашу коллекцию, если нет, вы можете создать новую коллекцию с жестко заданными значениями по умолчанию.

1 голос
/ 15 мая 2010

Я предлагаю вам организовать все ваши данные в удобочитаемом виде и спросить пользователя, где он хочет, чтобы они хранились на его компьютере (с использованием одного или нескольких файлов XML). Таким образом, пользователь может хранить файлы XML где угодно и понимать, что они делают. Он может использовать их, чтобы делиться своей «библиотекой» с другими, он может вносить изменения в эти XML-файлы вручную, он даже может создать свою собственную программу, которая использует тот же файл (своего рода дополнение к вашей собственной программе).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...