I have a static connection factory class and need to initialize the connection parameters from configuration
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;
}
}
}
From the main parogram I try to initialize these properties
MyConnectionFactory.Authority = "blahblah";
this throws a null value exception inside the static class. The value does not get to the 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
Is it wrong to set the values of static properties of a static class. I know about static constructor() but it does not take a parameters and I need to set the connection parameters. Is static factory not the right pattern for a connection factory. I can make this whole thing work if I don't make the factory static, but that does not seem the right thing to do.
private static ClientCredential ClientCredential = new ClientCredential(ClientId, ClientSecret); would be compiled as:
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
Now, when you try to assign Authority, the static constructor have to be called before. At this point, ClientId and ClientSecret are still null, which is causing the exception.
User contributions licensed under CC BY-SA 3.0