You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// @TODO: Ok, I think we should consider centralizing all these keywords into a single
// @todo: Ok, I think we should consider centralizing all these keywords into a single
// place. We have DbConnectionString*, Keywords, etc.
// Can we consider something DbConnectionOptions as backing store for the values
// and both SqlConnectionStringBuilder and SqlConnectionString use it to store?
one idea that can also be generic for any provider is the following:
keep DbConnectionStringSynonyms and DbConnectionStringKeywords for constants definition.
Create Attributes:
/// <summary>/// Defines the mapping between logical enum key and actual connection string key./// </summary>[AttributeUsage(AttributeTargets.Field)]publicsealedclassConnectionKeyAttribute(stringname,paramsstring[]synonyms):Attribute{publicstringName{get;}=name;publicHashSet<string>Synonyms=[.. synonyms];}
The enum and associated keys/Synonyms
/// <summary>/// Enumerates supported SQL Server connection string keys./// </summary>publicenumSqlConnectionKeys{[ConnectionKey(DbConnectionStringKeywords.ApplicationIntent,DbConnectionStringSynonyms.ApplicationIntent)]ApplicationIntent,[ConnectionKey(DbConnectionStringKeywords.ApplicationName,DbConnectionStringSynonyms.App)]ApplicationName,[ConnectionKey(DbConnectionStringKeywords.AttachDbFilename,DbConnectionStringSynonyms.ExtendedProperties,DbConnectionStringSynonyms.InitialFileName)]AttachDbFilename,[ConnectionKey(DbConnectionStringKeywords.AttestationProtocol)]AttestationProtocol,[ConnectionKey(DbConnectionStringKeywords.Authentication)]Authentication,[ConnectionKey(DbConnectionStringKeywords.ColumnEncryptionSetting)]ColumnEncryptionSetting,[ConnectionKey(DbConnectionStringKeywords.CommandTimeout)]CommandTimeout,[ConnectionKey(DbConnectionStringKeywords.ConnectRetryCount,DbConnectionStringSynonyms.ConnectRetryCount)]ConnectRetryCount,[ConnectionKey(DbConnectionStringKeywords.ConnectRetryInterval,DbConnectionStringSynonyms.ConnectRetryInterval)]ConnectRetryInterval,[ConnectionKey(DbConnectionStringKeywords.ConnectTimeout,DbConnectionStringSynonyms.ConnectionTimeout,DbConnectionStringSynonyms.Timeout)]ConnectTimeout,[ConnectionKey(DbConnectionStringKeywords.ContextConnection)]ContextConnection,[ConnectionKey(DbConnectionStringKeywords.CurrentLanguage,DbConnectionStringSynonyms.Language)]CurrentLanguage,[ConnectionKey(DbConnectionStringKeywords.DataSource,DbConnectionStringSynonyms.Addr,DbConnectionStringSynonyms.Address,DbConnectionStringSynonyms.NetworkAddress,DbConnectionStringSynonyms.Server)]DataSource,[ConnectionKey(DbConnectionStringKeywords.EnclaveAttestationUrl)]EnclaveAttestationUrl,[ConnectionKey(DbConnectionStringKeywords.Encrypt)]Encrypt,[ConnectionKey(DbConnectionStringKeywords.Enlist)]Enlist,[ConnectionKey(DbConnectionStringKeywords.FailoverPartner)]FailoverPartner,[ConnectionKey(DbConnectionStringKeywords.FailoverPartnerSpn,DbConnectionStringSynonyms.FailoverPartnerSpn)]FailoverPartnerSpn,[ConnectionKey(DbConnectionStringKeywords.HostNameInCertificate,DbConnectionStringSynonyms.HostNameInCertificate)]HostNameInCertificate,[ConnectionKey(DbConnectionStringKeywords.InitialCatalog,DbConnectionStringSynonyms.Database)]InitialCatalog,[ConnectionKey(DbConnectionStringKeywords.IntegratedSecurity,DbConnectionStringSynonyms.TrustedConnection)]IntegratedSecurity,[ConnectionKey(DbConnectionStringKeywords.IpAddressPreference,DbConnectionStringSynonyms.IpAddressPreference)]IpAddressPreference,[ConnectionKey(DbConnectionStringKeywords.LoadBalanceTimeout,DbConnectionStringSynonyms.ConnectionLifetime)]LoadBalanceTimeout,[ConnectionKey(DbConnectionStringKeywords.MultipleActiveResultSets,DbConnectionStringSynonyms.MultipleActiveResultSets)]MultipleActiveResultSets,[ConnectionKey(DbConnectionStringKeywords.MaxPoolSize)]MaxPoolSize,[ConnectionKey(DbConnectionStringKeywords.MinPoolSize)]MinPoolSize,[ConnectionKey(DbConnectionStringKeywords.MultiSubnetFailover,DbConnectionStringSynonyms.MultiSubnetFailover)]MultiSubnetFailover,[ConnectionKey(DbConnectionStringKeywords.PacketSize)]PacketSize,[ConnectionKey(DbConnectionStringKeywords.Password,DbConnectionStringSynonyms.Pwd)]Password,[ConnectionKey(DbConnectionStringKeywords.PersistSecurityInfo,DbConnectionStringSynonyms.PersistSecurityInfo)]PersistSecurityInfo,[ConnectionKey(DbConnectionStringKeywords.Pooling)]Pooling,[ConnectionKey(DbConnectionStringKeywords.PoolBlockingPeriod,DbConnectionStringSynonyms.PoolBlockingPeriod)]PoolBlockingPeriod,[ConnectionKey(DbConnectionStringKeywords.Replication)]Replication,[ConnectionKey(DbConnectionStringKeywords.ServerCertificate,DbConnectionStringSynonyms.ServerCertificate)]ServerCertificate,[ConnectionKey(DbConnectionStringKeywords.ServerSpn,DbConnectionStringSynonyms.ServerSpn)]ServerSpn,[ConnectionKey(DbConnectionStringKeywords.TrustServerCertificate,DbConnectionStringSynonyms.TrustServerCertificate)]TrustServerCertificate,[ConnectionKey(DbConnectionStringKeywords.TransactionBinding)]TransactionBinding,[ConnectionKey(DbConnectionStringKeywords.TypeSystemVersion)]TypeSystemVersion,[ConnectionKey(DbConnectionStringKeywords.UserId,DbConnectionStringSynonyms.Uid,DbConnectionStringSynonyms.User)]UserId,[ConnectionKey(DbConnectionStringKeywords.UserInstance)]UserInstance,[ConnectionKey(DbConnectionStringKeywords.WorkstationId,DbConnectionStringSynonyms.WsId)]WorkstationId}
Class to manage Keys and normalize
this class host
mapping between all keys/Synonyms => enum Keys;
mapping between enumKey and normalize Key (string)
by this way an easy way to normalize a connection string by replacing synonyms by official key (string).
/// <summary>/// Abstract base class for type-safe connection string management./// </summary>publicabstractclassConnectionStringBase<TKey>whereTKey:struct,Enum{protectedstaticreadonlyIReadOnlySet<string>NormalizeAliases=InitializeNormalizedAlias();protectedstaticreadonlyIReadOnlyDictionary<string,TKey>AliasToKey=InitializeAliasToKeyDictionary();protectedstaticreadonlyIReadOnlyDictionary<TKey,string>KeyToAlias=InitializeKeyToAliasDictionary();
#region Initialize dictionary
privatestaticHashSet<string>InitializeNormalizedAlias()=>[.. Enum<TKey>.GetAttributes<ConnectionKeyAttribute>().Select(a =>a.Name)];privatestaticDictionary<string,TKey>InitializeAliasToKeyDictionary()=>new(Enum<TKey>.GetEnumAttributePairs<ConnectionKeyAttribute>().SelectMany(pairs =>{varallAlias=pairs.Value.Synonyms;allAlias.Add(pairs.Value.Name);returnallAlias.Select(a =>KeyValuePair.Create(a,pairs.Key));}));privatestaticDictionary<TKey,string>InitializeKeyToAliasDictionary()=>Enum<TKey>.GetEnumAttributePairs<ConnectionKeyAttribute>().ToDictionary(x =>x.Key, x =>x.Value.Name);
#endregion
protectedstringNormalizeAlias(stringincomingAlias){try{returnNormalizeAliases.Contains(incomingAlias)?incomingAlias:KeyToAlias[AliasToKey[incomingAlias]];}catch(KeyNotFoundException){IoC.Instance.Resolve<IConsoleLogger>().Error($"this attributes '{incomingAlias}' is not an official key to construct connection string");returnstring.Empty;}}}
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
I saw some comments about centralized stuff
SqlClient/src/Microsoft.Data.SqlClient/src/Microsoft/Data/SqlClient/SqlConnectionStringBuilder.cs
Line 193 in be62e90
one idea that can also be generic for any provider is the following:
keep DbConnectionStringSynonyms and DbConnectionStringKeywords for constants definition.
Create Attributes:
The enum and associated keys/Synonyms
Class to manage Keys and normalize
this class host
Beta Was this translation helpful? Give feedback.
All reactions