【问题标题】:Using a Static Class to Initialize Members of another Static Class in ASP .NET在 ASP .NET 中使用静态类初始化另一个静态类的成员
【发布时间】:2020-04-25 10:56:15
【问题描述】:

静态类是否可以使用来自不同命名空间的另一个静态类中设置的值来初始化它的一些成员?有没有规定他们建立的顺序?

例如

namespace Utility
{
    using Config;

    public static class Utility
    {
        public static UtilityObject myUtil = new UtilityObject(ConfigContext.myValue)
    }
}
...
// somewhere in a different file/project
...
namespace Config
{
    public static class ConfigContext
    {
        public static string myValue => ConfigurationManager.AppSettings["key"];
    }
}

这是我试图完成的基本模式的简化示例;我想获取加载到 static class ConfigContext 的配置文件中的值,并使用它们来初始化 static class Utility 的成员。

【问题讨论】:

  • using namespace_two 语句移到namespace_one 块之外,您的代码应该可以工作。
  • 我不知道您为什么要这样做,但至少对我来说,这是一种代码味道。寻求“决定他们建立的顺序”表明了时间依赖性。那有什么意思?尝试使用静态类实例时会创建它们。
  • 是的,这是我正在尝试做的一个超级简化的示例,但核心概念是相同的。基本上我想使用加载到静态 ConfigContext 的配置文件中的值来初始化静态实用程序类的成员。
  • 太棒了。谢谢你。我看不到问题所在。看起来它应该可以工作,尽管我不推荐这种模式。不是很可单元测试。
  • 顺便说一句,如果不是很明显,我不是静态类的忠实粉丝... :-P

标签: c# asp.net static-classes


【解决方案1】:

您无法指定静态初始化的顺序。但是你可以通过延迟初始化使用惰性逻辑来完全避免这个问题。

public static class Utility
{
    private static Lazy<UtilityObject> _myUtil = null;

    private static Utility()
    {
        _myUtil = new Lazy<UtilityObject>( () => new UtilityObject(ConfigContext.myValue) );
    }

    public static myUtil => _myUtil.Value;
}

使用这种技术,实用程序对象在实际使用之前不会被初始化。

如果初始化 ConfigContext 的逻辑有类似的问题,您也可以在那里使用 Lazy,并且您的所有惰性字段都将按照需要的顺序以级联方式初始化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 2015-05-18
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    相关资源
    最近更新 更多