C# 从类库注入设置?

C# 从类库注入设置?,c#,class-library,C#,Class Library,我正在构建一个类库,我想知道什么是确保某些设置位于app.config/webconfig中的最佳方法 类库需要连接字符串和应用程序密钥 我知道使用nuget可以将设置插入配置文件,但我不使用nuget,所以我想知道是否有人有任何想法,或者我是否需要尝试捕捉,看看这些设置是否在配置文件中?试试这个 在清楚地阅读了这个问题之后,上面的链接将不起作用,但是下面的解决方案可能会起作用 无效或错误的设置实际上是编译时问题。您可以使用msbuild脚本验证app.config文件是否具有强制设置。如果不

我正在构建一个类库,我想知道什么是确保某些设置位于app.config/webconfig中的最佳方法

类库需要连接字符串和应用程序密钥

我知道使用nuget可以将设置插入配置文件,但我不使用nuget,所以我想知道是否有人有任何想法,或者我是否需要尝试捕捉,看看这些设置是否在配置文件中?

试试这个

在清楚地阅读了这个问题之后,上面的链接将不起作用,但是下面的解决方案可能会起作用

无效或错误的设置实际上是编译时问题。您可以使用msbuild脚本验证app.config文件是否具有强制设置。如果不是,则编译时应引发错误

要读取配置文件的内容,请使用Xmlread msbuild任务-

若要因缺少设置而失败,请使用如下所示的Xmlread任务的错误条件(尽管针对不同的任务),并将此任务附加到项目文件中,如图所示-


您可以选择不同类型的解决方案:

  • 你可以说,给你所需的信息,是用户的责任。因此,您只需确保当用户创建对象的实例时,它会为您提供所需的信息。对于类库来说,这是一个非常好的选择。您不想告诉谁将使用您的代码,以及如何管理他的设置。假设他有自己的保存配置的方法——为什么您必须绑定特定的配置类型(System.configuration)

  • 如果您坚持使用app.config/web.config,您可以只为程序集使用一个,而不使用应用程序主配置。您可以使用
    ConfigurationManager.OpenExeConfiguration
    。要知道程序集从何处运行,请使用
    assembly.getExecutionGassembly().Location
    。这样,您就可以打开自己的配置文件,并在文档中确保用户必须更新设置

  • 您可以告诉他必须在app.config/web.config中指定配置信息,如果您要查找的密钥不存在,则抛出exception


  • 检查设置是否存在,如果不存在则抛出异常。您可以将所需的设置转换为构造函数参数。@cadrell0-我在想这个问题,但我看到的代码(我想移动到库中)都是静态的(因此我想我可以有一个静态构造函数??)“是的”实际上是这样拼写的,除非你是意第绪语,否则不要说“是”,或者像“你想什么?”那样试图表达对船长的怀疑。罗伯塔维你可能是我的英雄。这是什么?它是如何工作的?请提供足够的信息在你的答案,它将是完整的,如果链接中断。是的,我没有得到它是什么。当我谈论注入时,我指的是如果配置文件不存在,自动将内容写入配置文件。好的,这允许您根据构造函数参数名称将设置注入对象。被误解的问题认为您想要摆脱魔术字符串并尝试catch。我应该在构造函数或每个方法中执行此操作吗?如果我们讨论的是win app、console或library,构造函数将是一个很好的观点。在web应用程序中,我将创建自己的类,该类继承自页面。在这个类中,我将重写页面init并检查设置。所有需要此检查的页面都只需要从我的类继承。那么简单的逻辑在构造函数+抛出异常中可以吗?
            //test settings...
            var a = System.Configuration.ConfigurationManager.AppSettings["myAppKey"];
            if (a == null)
            {
                Console.WriteLine("Application key does not exists!");
            }
            var b = System.Configuration.ConfigurationManager.ConnectionStrings["myConName"];
            if (b == null)
            {
                Console.WriteLine("Connection does not exists!");
            }