首页 > 解决方案 > 如何确保在 Global.Application_Start 代码之后初始化静态属性?

问题描述

如何确保在 Application_Start 之后初始化 Factory 类的属性?

public static class Globals
{
      public Static Customer Cust {get;set;}
}

public class WebApiApplication : HttpApplication
{

    protected void Application_Start()
    {
        Globals.Cust = GetCustomerFromDataBase();
    }
}

public static class Factory    
{
     public static Customer Cust => Globals.Cust ; 
}

Factory.Customer 被 webapi 控制器中的方法调用。

标签: c#asp.netasp.net-web-api

解决方案


您的问题的答案取决于您的代码。如果如您所说,Factory.Cust首先在 WebAPI Controller 方法中引用,那么您应该是安全的;该Application_Start方法应该在您的一个控制器中的任何内容之前运行。

您的Factory.Cust属性未初始化。当有人试图读取 的值时Factory.Cust,所发生的只是Globals.Cust属性(getter)被执行(请记住,属性实际上是代码,而不仅仅是状态)。只要在读取Globals.Cust之前进行了初始化,就安全了。Factory.Cust如果你测试你的代码(通过在这里和那里放置断点)并且它似乎遵循我所说的,你应该没问题。

我在关于静态类的评论中说的是静态类可以有一个构造函数。它可以是显式的(您为该类编写一个构造函数),但它也可以包含您的类中的其他代码。例如,如果在您的 Factory 类中,您的代码如下所示:

private static Customer _localCustomerStuff = new Customer();

然后与该字段关联的代码将被折叠到 Factory 构造函数中。像下面这样的属性初始化器也做同样的事情(因为它们正在初始化属性的隐藏后备存储)。

public static string SomeString { get; set; } = "SomeString Initial Value";

您不确切知道静态类的构造函数代码何时运行,但框架保证它将在对该类的任何引用之前运行。如果您访问 Factory 类,并且您有一些与该类关联的初始化(您在上面的帖子中都没有显示),那么您可以确定在您访问与该类有关的任何内容之前初始化已经开始。

查看Static Constructor Docs以了解我在说什么。


推荐阅读