在设计时从类库读取配置文件的替代方案

本文关键字:配置文件 方案 读取 类库 | 更新日期: 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目录中的其他几个配置文件(appsettingscnx字符串等)。在我的异常情况下,我试图获取的值位于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();
    }
}