c# - 初始化静态类的属性失败,出现空值异常
问题描述
我有一个静态连接工厂类,需要从配置中初始化连接参数
namespace MyApp.Common.LinqToDB
{
public static class MyConnectionFactory
{
public static string Authority { get; set; }
public static string Target { get; set; }
public static string ConnectionString { get; set; }
public static string ClientId { get; set; }
public static string ClientSecret { get; set; }
private static ClientCredential ClientCredential = new ClientCredential(ClientId, ClientSecret);
public static IDbConnection createConnection()
{
AuthenticationContext authenticationContext = new AuthenticationContext(Authority);
AuthenticationResult authenticationResult = authenticationContext.AcquireTokenAsync(Target, ClientCredential).Result;
SqlConnection MyDataConnection = new SqlConnection(ConnectionString);
MyDataConnection.AccessToken = authenticationResult.AccessToken;
return MyDataConnection;
}
}
}
从主parogram我尝试初始化这些属性
MyConnectionFactory.Authority = "blahblah";
这会在静态类中引发空值异常。该值不会到达类。
System.TypeInitializationException
HResult=0x80131534
Message=The type initializer for 'Workspace.Common.LinqToDB.WorkspaceConnectionFactory' threw an exception.
Source=Common
StackTrace:
at Workspace.Common.LinqToDB.WorkspaceConnectionFactory.set_Authority(String value) in
........
Inner Exception 1:
ArgumentNullException: Value cannot be null.
Parameter name: clientId
设置静态类的静态属性值是否错误。我知道静态构造函数(),但它不带参数,我需要设置连接参数。静态工厂不是连接工厂的正确模式吗?如果我不让工厂静态化,我可以让这一切正常工作,但这似乎不是正确的做法。
解决方案
private static ClientCredential ClientCredential = new ClientCredential(ClientId, ClientSecret);
将编译为:
private static ClientCredential ClientCredential;
//Static constructor
static MyConnectionFactory()
{
ClientCredential = new ClientCredential(ClientId, ClientSecret);
}
静态构造函数用于初始化任何静态数据,或执行只需要执行一次的特定操作。在创建第一个实例或引用任何静态成员之前自动调用它。
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/static-constructors
现在,当您尝试分配时Authority
,必须先调用静态构造函数。此时,ClientId
andClientSecret
仍然为 null,这是导致异常的原因。
推荐阅读
- laravel-backpack - 如何使用用户的时区作为默认值创建隐藏输入
- python - Pytorch Conv1D 为 ConvTranspose1d 提供不同的大小
- reactjs - DateInput 组件自动将记录中的日期格式设置为 YYYY-MM-DD
- javascript - Webpack babel-loader object-rest-spread 问题
- javascript - Testcafe 无法导入配置文件中的文件
- catboost - Catboost如何将模型保存到python内存对象而不是磁盘
- python - Web Scraping TooManyRedirects:超过 30 个重定向。requests_ip_rotator
- django - 如何在模型的 def save() 中访问 request.user?
- benchmarking - 如何设置 Linpack xtreme 输入参数
- c# - 如何使用存储库模式检查模型参数是否> =