在设计时从类库读取配置文件的替代方案
本文关键字:配置文件 方案 读取 类库 | 更新日期: 2023-09-27 18:28:30
我有一个WinForm项目,它包含几个UserControls。此WinForm项目引用了一个程序集(让我们称之为lib.dll
),该程序集是从其他解决方案中存在的另一个项目(类库)创建的。
现在,几个UserControls
调用lib.dll
,返回app.config
文件中的值。在运行时,lib.dll
工作正常并返回必要的数据,但在设计时,我从lib.dll
中得到了一个异常,因为app.config
部分是NULL
(异常是设计的)。
现在我可以遍历每个控件,并用包装调用lib的任何代码
if(!DesignMode) { //code }
但这是一个需要应用的大量控件。有什么比测试DesignMode属性更优雅的全局控件吗?
编辑
针对下面留下的两条评论:提供的解决方案似乎不起作用。导致我出现问题的程序集与app.config位于同一目录中
- 引用文件夹
- 配置(文件夹)
- appsettings.config
- app.config
- lib.dll
app.config
引入位于Configurations目录中的其他几个配置文件(appsettings
、cnx
字符串等)。在我的异常情况下,我试图获取的值位于app.config
引用的其中一个辅助配置文件中。
这是一个有趣的问题。一个解决方案可以是在lib.dll中创建一个类似以下的静态类:
public static class Config
{
private static readonly _param1;
static Config()
{
_param1 = ConfigurationManager.AppSettings["Param1"] ?? "Your default value";
}
public static string Param1
{
get { return _param1; }
}
}
然后,在您的代码中,您将使用Config.Param1,而不是编写ConfigurationManager.AppSettings["Param1"]。因此,您不需要测试属性DesignMode。
IMHO,有很多方法可以做到这一点。
脑海中浮现的一个想法是对有问题的用户控件使用基于继承的方法?这样,就可以在基类中放入if (DesignMode)
签入,并从那里进行正确的分支。
// if i were to visualizeyour lib.dll data initializer call like this:
class BaseUserControl
{
// i'm guessing that you initialize the data somehow...
void InitializeData()
{
if (!DesignMode)
{
InitializeDataLocal();
}
}
protected virtual InitializeDataLocal()
{
// whatever base behavior you want should go here.
}
}
// in the derived classes, just put the code you currently have for
// fetching the data from lib.dll here...
class UserControl : BaseUserControl
{
protected override InitializeDataLocal()
{
// fetch from lib.dll...
// optionally invoke some base behavior as well,
// if you need to...
base.InitializeDataLocal();
}
}