如何使用dll.config文件

问题描述 投票:-2回答:1

我有一个C#项目输出一个DLL:foo.dll。此foo.dll在内部使用旧版库legacy.dll。以下是我的库foo.dll的使用方法:首先我将这些文件:foo.dll,legacy.dll和legacy.dll.config上传到第三方;然后第三方启动一个进程,加载我的主库foo.dll并执行一些功能。当foo.dll运行时,我看到legacy.dll中抛出异常,说找不到某些配置“baz”。但是,我可以验证配置“baz”是否在legacy.dll.config文件中定义。所以我认为进程没有加载文件legacy.dll.config。

所以我想知道如何使用config.dll文件。在我的情况下,考虑到foo.dll是我控制范围内唯一的东西,有没有办法加载legacy.dll.config文件?

c# .net
1个回答
0
投票

一种解决方案是在配置(app.config或web.config)中将legacy.dll所需的配置部分放在引用它的应用程序中。

您是否可以控制您的遗留应用程序 - 换句话说,您是否可以修改它?偶然的一个挑战是,当所有这些额外值被转储到配置中时,可能更难以确定它们的使用位置。在您停止使用legacy.dll之后,它们甚至可以在配置中保留很长时间,因为没有人知道它们是什么,并且它们害怕将它们删除。

换句话说,如果配置中缺少值,最好不要抛出令人困惑的NullReferenceException或配置异常,这需要有人挖掘遗留代码并弄清楚它为什么不起作用。

There are a few things you can do to make this easier:

一个是您的legacy.dll可以查找与您的配置的其他部分不同且独立的配置值。

这可能意味着一个单独的配置部分

<section name="stuffTheLegacyDllNeeds" type="Legacy.LegacySettingsConfiguration, Legacy" />

<stuffTheLegacyDllNeeds>
    ....
</stuffTheLegacyDllNeeds>

或者您可以使用某些约定来消除appSettings键的歧义

<add key="myLegacyLibrary:someSetting" value="true" />

如果缺少必需的密钥,您还可以通过抛出有用的异常消息使其他开发人员更容易,例如“Legacy需要appSettings密钥'xyz',但未找到它。”他们仍然需要弄清楚在哪里找到价值观,但至少他们对问题有清晰的认识。

此外,如果您发现Legacy.dll不经常或永远不会更改设置,您可以对其进行编码以使用默认值替换缺失值。这样,如果需要通过添加配置值,他们可以覆盖默认值。但如果他们不需要默认值,他们就不能提供配置值。

还有一种方法 - 这是我个人喜欢的方法:

使您的遗留类依赖于诸如此类设置的界面

public interface ISettings
{
    bool SomeSetting { get; }
    int SomeOtherSetting { get; }
}

并使你的遗留类在其构造函数中需要一个ISettings实例。现在,引用它的应用程序“知道”有关设置的原因,因为它无法在不提供的情况下使用该类。您的旧库可以提供类似的实现

public class ConfigurationSettings : ISettings

从配置读取,引用应用程序可以选择使用它。或者它可以提供另一个实现接口的类。它还可以提供一个包含引用应用程序可能更改的默认值的类。如果引用应用程序不提供任何值,它也可以具有一组内部使用的默认值。

现在,

  • 引用应用程序知道您的类需要这些设置。
  • 引用应用程序可以选择如何提供它们。
  • 您的旧库不再取决于配置。它取决于抽象 - ISettings - 可以使用配置或其他方式实现。这意味着您的旧库将更容易进行单元测试。显式依赖于配置值的代码更难以测试,甚至可能永远不会被测试。
© www.soinside.com 2019 - 2024. All rights reserved.