在标准的3层应用程序(Winforms Ui,BLL,DAL)中,我需要为每个图层设置特定的设置。
我是否应该使用Winforms应用程序设置来包含所有这些设置,或者我应该让每个dll(BLL,DAL)都有自己的设置?
我需要一个简单的解决方案而不是数据库或自定义xmls,我还需要为同一架构提供多个UI。
更新:目前我倾向于每个图层的单独的.config文件,我只是不知道这是否是允许未来大部分更改的最佳做法(图层和/或更改)多个UI应用程序)。
结果:我想我在每个需要设置的项目中都会有一个静态单例类。我每次都会用最合适的方式在上层填充它们。
答案 0 :(得分:2)
自定义xml文件是灵活的方法,但需要一点努力。
仅使用单独的库项目来进行设置,更简单的方法是使用默认设置类来保存/加载设置,但对嵌套设置不是很灵活。
将所有设置放在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的良好机制,但它有点复杂。