【问题标题】:Design question for windows application, best approach?Windows 应用程序的设计问题,最佳方法?
【发布时间】:2010-05-15 18:52:17
【问题描述】:

我正在设计一个应用程序,该应用程序允许您查找由某些程序制作的图片(屏幕截图)。我将在应用程序本身中提供一些程序的位置,以便用户开始使用。

我想知道随着时间的推移如何添加新位置,我的第一个想法只是将其硬编码到应用程序中,但这意味着用户必须重新安装它才能使更改生效。

我的第二个想法是使用 XML 文件来包含所有位置以及其他数据,例如应用程序的名称。这也意味着用户可以根据需要添加自己的位置,也可以在互联网上共享它们。

第二个选项似乎是最好的方法,但我不得不考虑如何在用户计算机上对其进行管理。理想情况下,我只想要一个不依赖任何外部文件(如 XML)的 .exe,但这会让我回到第一点。

最好使用 ClickOnce 部署在开始菜单中创建一个条目并创建一个包含 .exe 和文件名的文件夹吗?

感谢您的反馈,在设计确定之前我不想开始实施应用程序。

【问题讨论】:

    标签: xml winforms architecture


    【解决方案1】:

    通常我不会将任何内容硬编码到应用程序中。正如您正确指出的那样,这会导致设计不灵活。

    我通常将此类配置信息存储在Local Application Data 文件夹下的 XML 文件中。

    如果您的用户始终(或经常)连接互联网,您可以考虑另一种(或额外的)功能,将此类“书签”信息存储在网络服务上。

    编辑:

    这是我多年来用于此类事情的代码 sn-p

    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;
                }
            }
    
        }
    }
    

    【讨论】:

    • 本地应用程序数据似乎是个好主意,但我似乎找不到太多关于如何正确实施它的文档,除非我使用的是糟糕的谷歌搜索。
    • @Jamie:查看stackoverflow.com/questions/1992905/… 接受的答案,您使用那里概述的方法获得路径,然后将文件写入该路径。正如 Oded 指出的那样,您可以使用 XmlSerializer (例如)来保存和加载数据。稍后我会在我的答案中发布一个代码示例。
    • 感谢 sn-p 并链接到另一个问题,我一定会使用特殊文件夹方法和其他答案中的建议。
    【解决方案2】:

    我将采用的方法是创建一个Locations 类(和集合),我可以将其序列化为一个 XML 文件(使用XmlSerializerDataContractSerializer)。

    您可以检查 XML 文件是否存在 - 如果存在,则将其反序列化到您的集合中,如果不存在,您可以使用硬编码的默认值创建一个新集合。

    【讨论】:

    • 我认为这将是结合肖恩提出的解决方案的最佳解决方案,通过允许用户指定 XML 文件的位置,这可能更容易让他们使用而不是强迫他们把它放在某个位置。
    【解决方案3】:

    我建议您以用户可读的方式组织所有数据,并询问用户希望将其存储在计算机上的哪个位置(使用一个或多个 XML 文件)。这样,用户可以将 XML 文件存储在他喜欢的任何地方并了解它们的用途。他可以使用它们与其他人共享他的“库”,他可以手动对这些 XML 文件应用更改,他甚至可以制作使用相同文件的自己的程序(您自己程序的某种附加组件)。

    【讨论】:

    • 好主意,允许用户选择目的地意味着他们不会受到太多限制。
    猜你喜欢
    • 2018-01-21
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    • 2014-05-02
    • 2023-03-29
    • 2015-04-18
    • 1970-01-01
    相关资源
    最近更新 更多