配置设置放置在3层应用程序中

时间:2012-12-13 06:44:58

标签: c# design-patterns configuration

在标准的3层应用程序(Winforms Ui,BLL,DAL)中,我需要为每个图层设置特定的设置。

我是否应该使用Winforms应用程序设置来包含所有这些设置,或者我应该让每个dll(BLL,DAL)都有自己的设置?

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

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

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

3 个答案:

答案 0 :(得分:2)

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

  2. 仅使用单独的库项目来进行设置,更简单的方法是使用默认设置类来保存/加载设置,但对嵌套设置不是很灵活。

  3. 将所有设置放在DAL中,因为它位于root,所有其他项目(UI,BAL)引用它)

答案 1 :(得分:1)

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

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

<强>更新

来自评论:

  

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

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

答案 2 :(得分: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(字符串ConfigFileName)工厂方法,它将生成一个默认值的示例配置。

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

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