3

在标准的 3 层应用程序(Winforms Ui、BLL、DAL)中,我需要针对每一层进行设置。

我应该使用 Winforms 应用程序设置来包含所有这些,还是应该让每个 dll(BLL、DAL)都带有它们的设置?

我需要一个简单的解决方案,而不是在数据库或自定义 xmls 中,我还需要为同一架构提供多个 UI。

更新:目前我倾向于为每个层使用单独的 .config 文件,我只是不知道这是否是允许大多数未来更改(层和/或多个 UI 应用程序的更改)的最佳实践。

结果:我想我将在每个需要设置的项目中都有一个静态单例类。每次我都会用最合适的方式将它们填充到上层。

4

3 回答 3

2
  1. 自定义 xml 文件是一种灵活的方法,但需要一些努力。

  2. 使用单独的库项目仅用于设置,这是一种更简单的方法,因为您可以使用默认设置类来保存/加载设置,但对于嵌套设置不是很灵活。

  3. 使用 DAL 放置所有设置,因为它位于根目录下,所有其他项目(UI、BAL)都引用它)

于 2012-12-13T07:31:48.913 回答
1

如果所有层都在同一个 AppDomain 中运行(而不是在 WCF 服务中托管 BLL/DAL),那么 KISS 解决方案是将所有配置信息包含在客户端的 app.config 文件中。

您可以使用命名约定来区分属于每个层的设置。

更新

来自评论:

目前是的,但我希望以后可以自由更改 DAL 演示文稿(例如通过 WCF)。

这很简单:当您将逻辑层移动到不同的物理层(例如 WCF)时,您会将其配置移动到主机的配置文件中(例如,如果主机是 IIS,则为 web.config)。

于 2012-12-13T09:05:49.530 回答
1

每次我尝试使用内置的 app.config 文件时,由于内置解决方案的缺点,我最终实现了自己的配置解决方案。实现自定义的基于 xml 的解决方案并不复杂。这实际上很容易。

只需将此基类放入您的解决方案中:

[Serializable]
public abstract class ConfigBase<DerivedT> where DerivedT : ConfigBase<DerivedT>
{
    protected string FilePath;
    public string FileVersion;

    public ConfigBase() { }

    public void Save()
    {
        XmlSerializer xs = new XmlSerializer(GetType());
        using (StreamWriter writer = File.CreateText(FilePath))
        {
            xs.Serialize(writer, this);
        }
    }

    public static DerivedT Load(string filename)
    {
        XmlSerializer xs = new XmlSerializer(typeof(DerivedT));
        using (StreamReader reader = File.OpenText(filename))
        {
            DerivedT config = (DerivedT)xs.Deserialize(reader);
            config.FilePath = filename;
            return config;
        }
    }
}

然后你可以像这样制作你的配置文件:

public class Config : ConfigBase<Config>
{
    // put your variables here like below
    public string DatabaseConnectionString;
    public int numberOfConnections;
}

像这样使用它:

// Load it like this
Config config = Config.Load(ConfigFileName);
// Save it like this
config.Save();

随意在配置文件中使用属性、数组和其他复杂结构。它将全部自动序列化。如果您不想序列化某些字段/属性,请使用 XmlIgnore 属性。使用此解决方案,您可以拥有许多不同的配置文件,但只有一个机制来加载和保存它们。

我经常在 Config 文件中包含一个公共静态 Config GenerateDefault(string ConfigFileName) 工厂方法,它将生成一个具有默认值的示例配置。

不要忘记检查文件文件是否存在并将其加载到 try/catch 块中。

一个更好的解决方案是使用 DataContracts,它允许您序列化私有成员并提供良好的机制来支持不同版本的 DataContracts,但它有点复杂。

于 2012-12-13T09:53:08.813 回答