C# 在类库中设置配置设置的最标准方法

C# 在类库中设置配置设置的最标准方法,c#,.net,api,C#,.net,Api,我正在开发一个类库/API,我需要存储一些将由某些类使用的全局参数。我考虑了两种主要方法(忽略配置文件,我不希望在本例中使用这些文件): 1) 在静态类中指定参数,如下所示: // Stores and validates settings ApiConfiguration.SetConfiguration("some values or class here"); var methods1 = new MyFirstApiMethods(); methods1.DoStuff(); // I

我正在开发一个类库/API,我需要存储一些将由某些类使用的全局参数。我考虑了两种主要方法(忽略配置文件,我不希望在本例中使用这些文件):

1) 在静态类中指定参数,如下所示:

// Stores and validates settings
ApiConfiguration.SetConfiguration("some values or class here");

var methods1 = new MyFirstApiMethods();
methods1.DoStuff(); // Internally uses static ApiConfiguration.

var methods2 = new MySecondApiMethods();
methods2.DoOtherStuff();  // Internally uses static ApiConfiguration.
// Create an instance of the configuration class
var config = new ApiConfiguration();
config.ServerName = "some-server-name";

var methods1 = new MyFirstApiMethods(config);
methods1.DoStuff(); // Uses the supplied ApiConfiguration instance.

var methods2 = new MySecondApiMethods(config);
methods2.DoOtherStuff(); // Uses the supplied ApiConfiguration instance.
2) 创建配置类的实例并将其传递给类,如下所示:

// Stores and validates settings
ApiConfiguration.SetConfiguration("some values or class here");

var methods1 = new MyFirstApiMethods();
methods1.DoStuff(); // Internally uses static ApiConfiguration.

var methods2 = new MySecondApiMethods();
methods2.DoOtherStuff();  // Internally uses static ApiConfiguration.
// Create an instance of the configuration class
var config = new ApiConfiguration();
config.ServerName = "some-server-name";

var methods1 = new MyFirstApiMethods(config);
methods1.DoStuff(); // Uses the supplied ApiConfiguration instance.

var methods2 = new MySecondApiMethods(config);
methods2.DoOtherStuff(); // Uses the supplied ApiConfiguration instance.
第一个选项对我来说更自然,但我可以想到一些可能的缺点(例如,如果配置设置在两个具有不同值的地方)

我想知道每个实现的可能缺点,以及在这种性质的已知项目中最常见的实现方法。

我想说#1是最常见的。我知道你说过你不想使用配置文件,但如果你看看.NET是如何使用app.config的,我想你会看到对#1采取了类似的方法。您不会看到app.config设置的实例被传递给每个需要读取设置的方法/函数。我通常使用VB.NET,它有一个静态的My.Settings类,基本上实现了与您的#1相同的功能

我看到的#2最大的缺点(可能也是它不太常见的原因)是config类可以传递很多信息。如果只有一小部分方法需要读取配置,这可能没问题,但是如果有很多方法需要读取配置,这就开始让人头疼了。在我看来,它也会使方法签名变得杂乱无章。设想库中有一个类需要读取配置文件;您可能需要将配置传递给几个更高级别的类,以便将其传递给需要它的类

我建议至少考虑使用app.config或web.config,因为它们中的任何一个都已经为这类东西内置了功能

编辑

我一直在等布兰农举个例子,但既然他没有,我就继续插话。IOC容器是帮助依赖注入的好工具,但我不想只为设置类引入一个。如果您已经在使用一个,那么情况可能会有所不同。让我们假设您已经在使用一个IOC容器,并希望将其用于您的配置类。这意味着您仍然有如下方法签名:

Function Add (FirstNumber, SecondNumber, Config)
诚然,这个例子有些牵强,但你明白了。IOC容器将解析您的配置依赖关系(它将为您创建Config类),但您仍然将Config作为每个需要它的方法/构造函数的参数


老实说,其中有些是个人喜好造成的。请记住,当您使用app.config时,VS/.NET会使用现成的#1。我知道,静态类经常受到反对,在许多情况下,这是理所当然的,但我认为设置/配置类是规则的例外。

我想知道您为什么放弃配置文件。那里的大多数库都使用web.config或它自己的文件。考虑到对配置的更改需要重新生成。我不太喜欢客户端必须包含.dll.config文件的想法,但这更像是个人偏好。客户端可以(也应该)将配置项存储在配置文件中,读取它们,然后将它们提供给库。通常,您可以利用现有的app.config或web.config并使用它。您只需要在库文档中添加所需的配置项。您是对的,但在这种情况下,大多数参数通常不会存储在app或web.config中,因为它们必须从用户处收集。谢谢!我会考虑使用配置文件(加上第一种方法),因为每个人都在这样指出。我将阅读更多关于它的内容,并进行一些测试,看看它是否满足我的所有需求。我完全不同意给出的第一个答案#2是绝对正确的方法——当然,它与一个漂亮的IoC容器结合使用。你不能到处传递任何东西。相反,注入器将为您处理这些问题,您将能够使用设置进行单元测试。@Brannon您可以发布一个示例吗?@Meryovi您熟悉IOC容器吗?@CaseyWilkins不太熟悉,但我已经读了一些书并理解了这个概念。