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

时间:2012-03-20 20:31:52

标签: c# winforms

我有一个包含多个UserControl的WinForm项目。此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引用的其中一个辅助配置文件中。

2 个答案:

答案 0 :(得分:0)

这是一个有趣的问题。一个解决方案可能是在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; }
    }
}

然后,在您的代码中,编写了ConfigurationManager.AppSettings [“Param1”],您将使用Config.Param1。因此,您不需要测试属性DesignMode。

答案 1 :(得分:0)

有很多方法可以做到这一点,恕我直言。

我想到的一个想法就是对所讨论的用户控件使用基于继承的方法吗?这样,在基类中,您可以将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();
    }
}