c# - 使用静态类来促进对应用程序设置的访问是否可以接受?

标签 c# .net

<分区>

我的应用程序的 app.config 文件中有一些 key ,用于存放电子邮件设置。我目前正在为工作开发的应用程序有几个地方需要发送电子邮件(主要是在错误检查中让我们知道发生了不好的事情)。为了更容易地在我需要的地方获取该设置(而不是返回到 app.config 来查找要在 ConfigurationManager.AppSettings["SomeKey"].ToString() 中使用的文本字符串我创建了一个简单的静态类来容纳一些返回我需要的值的只读属性。这是基本结构

internal static Class myClass
{
    internal static string setting1
    {
        get { return ConfigurationManager.AppSettings["SomeKey"].ToString(); }
    }
    internal static string setting2
    {
        get { return ConfigurationManager.AppSettings["SomeOtherKey"].ToString(); }
    }
}

我这样做的方式可以接受吗?我找不到这方面的问题,但忍不住想我错过了什么。

附加信息:

我知道简单使用 Settings.Settings 文件的方法。 由于我工作的地方的代码策略,我无法使用 Settings.Settings 文件,这将使我没有必要这样做。

编辑: 我所说的“可接受”是指它是普遍完成的还是被认为是一个好主意?我意识到整个社区无法推测我工作的可接受性。

最佳答案

这还不错,但可以通过小的调整变得更好。 (好吧,也许不是真的小。)

如果您的类依赖于静态类并且该类依赖于 AppSettings那么你的类(class)仍然耦合到 AppSettings .换句话说,他们没有其他方法来获取他们的设置。如果您想对您的类(class)进行单元测试,那将是一个挑战。这意味着您的单元测试项目必须具有相同的 <appSettings>部分。但是,如果您想要两个测试使用两个不同的设置值怎么办?不可能。或者如果你有一个需要设置的类,几年后你想在 ASP.NET Core 应用程序中使用它,但没有 web.config 怎么办?那就根本不行了。

要避免这种情况,您可以这样做:

public interface IMySettings
{
    string Setting1 {get;}
    string Setting2 {get;}
}

public class MyConfigurationSettings : IMySettings
{
    public string Setting1
    {
        get { return ConfigurationManager.AppSettings["SomeKey"].ToString(); }
    }
    public string Setting2
    {
        get { return ConfigurationManager.AppSettings["SomeOtherKey"].ToString(); }
    }
}

然后,在需要设置的类中:

public class ClassThatNeedsSettings
{
    private readonly IMySettings _settings;

    public ClassThatNeedsSettings(IMySettings settings)
    {
        _settings = settings;
    }
}

然后,每当您创建 ClassThatNeedsSettings 的实例时您传递了一个实现 IMySettings 的类的实例,类将使用它来检索设置。当您的应用程序运行时,您传入 MyConfigurationSettings这样你的值就来自 AppSettings .但是ClassThatNeedsSettings永远不知道。它只知道它正在使用 IMySettings 的实例。 .

这称为“依赖注入(inject)”。 ClassThatNeedsSettings取决于 IMySettings所以你把它“注入(inject)”到构造函数中。那样ClassThatNeedsSettings收到它需要的东西。它不负责创建它。

如果要单元测试,可以“mock”IMySettings .也就是说,您可以创建其他实现该接口(interface)的类,并使用它们来传递您想要测试的任何值。甚至还有像 Moq 这样的工具可以帮助您创建这些类。

通常情况下,如果您使用依赖注入(inject),您还将使用诸如 Windsor、Unity、Autofac 或其他框架来管理为您创建对象。感觉有点像在最后引入它的诱饵和开关,因为它需要更多的学习,并且可能需要改变应用程序的配置方式。但这就是我们使用它的原因,以防止一个类对另一个类产生绝对依赖,这会降低灵 active 并更难测试。

关于c# - 使用静态类来促进对应用程序设置的访问是否可以接受?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38106710/

相关文章:

.net - 所有者绘制 TextBox 以在 WinForms 中使用

c# - 在 HttpClient 和 WebClient 之间做出决定

c# - 图形容器如何工作?

c# - Winforms - 单击控件的 WM_NCHITEST 消息

c# - 返回 Enumerable.Empty<T>().AsQueryable() 是个坏主意吗?

c# - 将 Visual Studio 2015 项目转换为 Visual Studio 2017?

c# - 正则表达式,获取其余不匹配的字符串

c# - 方法应返回多个值

c# - 缺少桌面 DLL 中的 Prism PopupChildWindowAction

c# - 如何在不丢失 .NET 中的 alpha channel 的情况下从剪贴板中获取图像?