c# - 如何确保在 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 控制器中的方法调用。
解决方案
您的问题的答案取决于您的代码。如果如您所说,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以了解我在说什么。
推荐阅读
- javascript - 选择文字时自动弹出菜单
- java - 如果在同步方法中调用等待方法,我的 java 单元测试失败
- python - Python re.findall 不匹配 HTML 中的 JS 变量
- python - Flask/Jinja 错误:jinja2.exceptions.TemplateSyntaxError:预期令牌“名称”,得到“字符串”
- react-native - react-native FlatList undefined 不是对象(评估'props.getItem')
- flutter - 尝试添加路径来定位颤振以运行“颤振医生”以解决“zsh:找不到命令:颤振”
- pivot-table - 在 Finicast 中,我无法将公式应用于数据透视表中的一组单元格
- php - Roundcube附件上传内部服务器错误
- amazon-web-services - 客户端到客户端的通信在 AWS Lightsail Debian Linux OpenVPN 服务器上不起作用
- pine-script - valuewhen() 没有提供正确的值