初始化静态 class 的属性失败,出现空值异常
Initializing properties of static class fails with null value exception
我有一个静态连接工厂class,需要从配置中初始化连接参数
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;
}
}
}
我尝试在主程序中初始化这些属性
MyConnectionFactory.Authority = "blahblah";
这会在静态 class 中引发空值异常。该值没有到达 class.
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
设置静态属性的值是否错误class。
我知道 static constructor() 但它不带参数,我需要设置连接参数。
静态工厂不是连接工厂的正确模式吗?如果我不使工厂静态化,我可以使整个事情正常进行,但这似乎不是正确的做法。
private static ClientCredential ClientCredential = new ClientCredential(ClientId, ClientSecret);
将编译为:
private static ClientCredential ClientCredential;
//Static constructor
static MyConnectionFactory()
{
ClientCredential = new ClientCredential(ClientId, ClientSecret);
}
A static constructor is used to initialize any static data, or to perform a particular action that needs to be performed once only. It is called automatically before the first instance is created or any static members are referenced.
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/static-constructors
现在,当您尝试分配 Authority
时,必须先调用静态构造函数。此时,ClientId
和 ClientSecret
仍然为空,这导致了异常。
我有一个静态连接工厂class,需要从配置中初始化连接参数
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;
}
}
}
我尝试在主程序中初始化这些属性
MyConnectionFactory.Authority = "blahblah";
这会在静态 class 中引发空值异常。该值没有到达 class.
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
设置静态属性的值是否错误class。 我知道 static constructor() 但它不带参数,我需要设置连接参数。 静态工厂不是连接工厂的正确模式吗?如果我不使工厂静态化,我可以使整个事情正常进行,但这似乎不是正确的做法。
private static ClientCredential ClientCredential = new ClientCredential(ClientId, ClientSecret);
将编译为:
private static ClientCredential ClientCredential;
//Static constructor
static MyConnectionFactory()
{
ClientCredential = new ClientCredential(ClientId, ClientSecret);
}
A static constructor is used to initialize any static data, or to perform a particular action that needs to be performed once only. It is called automatically before the first instance is created or any static members are referenced.
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/static-constructors
现在,当您尝试分配 Authority
时,必须先调用静态构造函数。此时,ClientId
和 ClientSecret
仍然为空,这导致了异常。