55// Created: 2013.09.27
66
77using System ;
8+ using System . Collections ;
9+ using System . Collections . Generic ;
810using System . Configuration ;
11+ using System . Diagnostics . CodeAnalysis ;
12+ using Microsoft . Extensions . Configuration ;
913using Xtensive . Core ;
1014
1115namespace Xtensive . Orm . Configuration
1216{
1317 internal static class ConnectionInfoParser
1418 {
19+ private readonly struct UnifiedAccessor
20+ {
21+ private readonly IDictionary < string , string > connectionStringsAsDict ;
22+ private readonly ConnectionStringSettingsCollection connectionStrings ;
23+
24+ public string this [ string key ] {
25+ get {
26+ if ( connectionStrings != null )
27+ return connectionStrings [ key ] ? . ConnectionString ;
28+ else if ( connectionStringsAsDict != null )
29+ return connectionStringsAsDict [ key ] ;
30+ return null ;
31+ }
32+ }
33+
34+ public UnifiedAccessor ( ConnectionStringSettingsCollection oldConnectionStrings )
35+ {
36+ connectionStringsAsDict = null ;
37+ connectionStrings = oldConnectionStrings ;
38+ }
39+ public UnifiedAccessor ( IDictionary < string , string > connectionStrings )
40+ {
41+ connectionStringsAsDict = connectionStrings ;
42+ this . connectionStrings = null ;
43+ }
44+ }
45+
1546 public static ConnectionInfo GetConnectionInfo ( System . Configuration . Configuration configuration , string connectionUrl , string provider , string connectionString )
1647 {
17- bool connectionUrlSpecified = ! string . IsNullOrEmpty ( connectionUrl ) ;
18- bool connectionStringSpecified = ! string . IsNullOrEmpty ( connectionString ) && ! string . IsNullOrEmpty ( provider ) ;
48+ var accessor = new UnifiedAccessor ( configuration . ConnectionStrings . ConnectionStrings ) ;
49+ return GetConnectionInfoInternal ( accessor , connectionUrl , provider , connectionString ) ;
50+ }
51+
52+ public static ConnectionInfo GetConnectionInfo ( IDictionary < string , string > connectionStrings , string connectionUrl , string provider , string connectionString )
53+ {
54+ var accessor = new UnifiedAccessor ( connectionStrings ) ;
55+ return GetConnectionInfoInternal ( accessor , connectionUrl , provider , connectionString ) ;
56+ }
57+
58+ private static ConnectionInfo GetConnectionInfoInternal ( in UnifiedAccessor connectionStringAccessor ,
59+ string connectionUrl , string provider , string connectionString )
60+ {
61+ var connectionUrlSpecified = ! string . IsNullOrEmpty ( connectionUrl ) ;
62+ var connectionStringSpecified = ! string . IsNullOrEmpty ( connectionString ) && ! string . IsNullOrEmpty ( provider ) ;
1963
2064 if ( connectionUrlSpecified && connectionStringSpecified )
2165 throw new InvalidOperationException ( Strings . ExConnectionInfoIsWrongYouShouldSetEitherConnectionUrlElementOrProviderAndConnectionStringElements ) ;
@@ -24,30 +68,31 @@ public static ConnectionInfo GetConnectionInfo(System.Configuration.Configuratio
2468 return new ConnectionInfo ( connectionUrl ) ;
2569
2670 if ( connectionStringSpecified )
27- return new ConnectionInfo ( provider , ExpandConnectionString ( configuration , connectionString ) ) ;
71+ return new ConnectionInfo ( provider ,
72+ ExpandConnectionString ( connectionStringAccessor , connectionString ) ) ;
2873
2974 // Neither connection string, nor connection url specified.
3075 // Leave connection information undefined.
3176 return null ;
3277 }
3378
34- private static string ExpandConnectionString ( System . Configuration . Configuration configuration , string connectionString )
79+ private static string ExpandConnectionString ( in UnifiedAccessor connectionStrings , string connectionString )
3580 {
3681 const string prefix = "#" ;
3782
3883 if ( ! connectionString . StartsWith ( prefix , StringComparison . Ordinal ) )
3984 return connectionString ;
4085
41- string connectionStringName = connectionString . Substring ( prefix . Length ) ;
86+ var connectionStringName = connectionString [ prefix . Length .. ] ;
4287
43- var connectionStringSetting = configuration . ConnectionStrings . ConnectionStrings [ connectionStringName ] ;
44- if ( connectionStringSetting == null )
88+ var connectionStringSetting = connectionStrings [ connectionStringName ] ;
89+ if ( connectionStringSetting == null )
4590 throw new InvalidOperationException ( string . Format ( Strings . ExConnectionStringWithNameXIsNotFound , connectionStringName ) ) ;
4691
47- if ( string . IsNullOrEmpty ( connectionStringSetting . ConnectionString ) )
92+ if ( string . IsNullOrEmpty ( connectionStringSetting ) )
4893 throw new InvalidOperationException ( string . Format ( Strings . ExConnectionStringWithNameXIsNullOrEmpty , connectionStringName ) ) ;
4994
50- return connectionStringSetting . ConnectionString ;
95+ return connectionStringSetting ;
5196 }
5297 }
5398}
0 commit comments