2016-11-28 122 views
3

我加如何在.NET Core中讀取connectionString WITH PROVIDER?

.AddJsonFile("Connections.json", optional: true, reloadOnChange: true) 

public Startup(IHostingEnvironment env) 

Connections.json包含:

{ 
    "ConnectionStrings": { 
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=DATABASE;Trusted_Connection=True;MultipleActiveResultSets=true", 
    "COR-W81-101": "Data Source=DATASOURCE;Initial Catalog=P61_CAFM_Basic;User Id=USERID;Password=PASSWORD;Persist Security Info=False;MultipleActiveResultSets=False;Packet Size=4096;", 
    "COR-W81-100": "Data Source=DATASOURCE;Initial Catalog=Post_PS;User Id=USERID;Password=PASSWORD;Persist Security Info=False;MultipleActiveResultSets=False;Packet Size=4096;", 
    "MSEDGEWIN10": "Data Source=DATASOURCE; Initial Catalog=COR_Basic; Persist Security Info=False;Integrated Security=true;MultipleActiveResultSets=False;Packet Size=4096;Application Name=\"COR_Basic\"", 

    "server": "Data Source=DATASOURCE; Initial Catalog=COR_Basic; Persist Security Info=False;User Id=USERID;Password=PASSWORD;MultipleActiveResultSets=False;Packet Size=4096;Application Name=\"COR_Basic\"" 
    }, 


    "conStrings": [ 
     { 
     "name": "COR-W81-101",  
     "connectionString": "Data Source=DATASOURCE; Initial Catalog=COR_Basic; Persist Security Info=False;Integrated Security=true;MultipleActiveResultSets=False;Packet Size=4096;Application Name=\"COR_Basic\"", 
     "providerName": "System.Data.SqlClient" 
     } 

    }, 

    { 
     "name": "server", 
     "connectionString": "Data Source=DATASOURCE; Initial Catalog=COR_Basic; Persist Security Info=False;Integrated Security=true;MultipleActiveResultSets=False;Packet Size=4096;Application Name=\"COR_Basic\"", 
     "providerName": "System.Data.SqlClient" 
    } 
    ], 



    "conStringDictionary": { 
    "COR-W81-101": { 
     "connectionString": "Data Source=DATASOURCE; Initial Catalog=COR_Basic; Persist Security Info=False;Integrated Security=true;MultipleActiveResultSets=False;Packet Size=4096;Application Name=\"COR_Basic\"", 
     "providerName": "System.Data.SqlClient" 
    }, 

    "server": { 
     "connectionString": "Data Source=DATASOURCE; Initial Catalog=COR_Basic; Persist Security Info=False;Integrated Security=true;MultipleActiveResultSets=False;Packet Size=4096;Application Name=\"COR_Basic\"", 
     "providerName": "System.Data.SqlClient" 
    } 

    } 
} 

現在我想讀的ConnectionStrings:

public class ConnectionString 
{ 
    public string name { get; set; } 
    public string connectionString { get; set; } 
    public string providerName { get; set; } 
} 

樣T他的:

//Microsoft.Extensions.DependencyInjection.OptionsConfigurationServiceCollectionExtensions.Configure<ConnectionString[]>(services, Configuration.GetSection("conStrings")); 

// https://stackoverflow.com/questions/31929482/retrieve-sections-from-config-json-in-asp-net-5 
//var objectSections = Configuration.GetSection("conStringDictionary").GetChildren(); 
//foreach (var x in objectSections) 
//{ 
// System.Console.WriteLine(x.Key); 
// var cs = new ConnectionString(); 
// ConfigurationBinder.Bind(x, cs); 
// System.Console.WriteLine(cs); 
//} 

// http://andrewlock.net/how-to-use-the-ioptions-pattern-for-configuration-in-asp-net-core-rc2/ 
     Microsoft.Extensions.DependencyInjection.OptionsConfigurationServiceCollectionExtensions.Configure<Dictionary<string, ConnectionString>>(services, Configuration.GetSection("conStrings")); 

但我不能讓它讀取數組或字典。我需要每個connectionString的providerName,並且我想將它與連接字符串放在同一個條目中,但不是作爲連接字符串。

+0

您的Connections.json無效。你的「conStrings」數組需要很多「}」。它應該看起來像http://www.jsoneditoronline.org/?id=a00f0105a65d6a651d872ea9688d6147 –

+5

夥計,你剛剛發佈連接字符串到您的數據庫公共視圖。考慮至少刪除密碼! – Maris

+0

@Maris:沒關係,在我發佈之前改變了它們 - 忘記了一個,但無論如何都是TrippleDES加密的。數據源不是保密的。 – User1

回答

2

你基本上是在那裏,你所要做的就是做一些強類型的類相匹配的舊ConnectionStringSettings和利用一些收集序列化邏輯。

以下是我建議如何在json中格式化它們的方法。與您如何將連接字符串指定爲舊的XML應用/ web.config方式類似。連接字符串的名稱是關鍵字。現在

{ 
    "ConnectionStrings": { 
    "Test1": { 
     "ConnectionString": "server=localhost;database=db;username=user;password=pass;", 
     "ProviderName": "MySql.Data.MySqlClient" 
    }, 
    "Test2": { 
     "ConnectionString": "server=localhost;database=db2;username=user2;password=pass2;", 
     "ProviderName": "MySql.Data.MySqlClient" 
    } 
    } 
} 

的類綁定。首先是簡單的ConnectionStringSettings類本身,實現了你的基本相等/散列方法(當我們打算把它粘在一個字典中時,這是必要的)。

public class ConnectionStringSettings 
{ 
    public String Name { get; set; } 
    public String ConnectionString { get; set; } 
    public String ProviderName { get; set; } 

    public ConnectionStringSettings() 
    { 
    } 

    public ConnectionStringSettings(String name, String connectionString) 
     : this(name, connectionString, null) 
    { 
    } 

    public ConnectionStringSettings(String name, String connectionString, String providerName) 
    { 
     this.Name = name; 
     this.ConnectionString = connectionString; 
     this.ProviderName = providerName; 
    } 

    protected bool Equals(ConnectionStringSettings other) 
    { 
     return String.Equals(Name, other.Name) && String.Equals(ConnectionString, other.ConnectionString) && String.Equals(ProviderName, other.ProviderName); 
    } 

    public override bool Equals(Object obj) 
    { 
     if (ReferenceEquals(null, obj)) return false; 
     if (ReferenceEquals(this, obj)) return true; 
     if (obj.GetType() != this.GetType()) return false; 
     return Equals((ConnectionStringSettings) obj); 
    } 

    public override int GetHashCode() 
    { 
     unchecked 
     { 
      int hashCode = (Name != null ? Name.GetHashCode() : 0); 
      hashCode = (hashCode * 397)^(ConnectionString != null ? ConnectionString.GetHashCode() : 0); 
      hashCode = (hashCode * 397)^(ProviderName != null ? ProviderName.GetHashCode() : 0); 
      return hashCode; 
     } 
    } 

    public static bool operator ==(ConnectionStringSettings left, ConnectionStringSettings right) 
    { 
     return Equals(left, right); 
    } 

    public static bool operator !=(ConnectionStringSettings left, ConnectionStringSettings right) 
    { 
     return !Equals(left, right); 
    } 
} 

接下來是ConnectionStringSettings的集合。這只是必要的,因爲連接字符串的名稱是JSON記法中的鍵。爲了保持這個名字的連貫性,我們需要重寫Dictionary的Add方法(但是你不能這樣做,因爲它不是虛擬的)。所以我們真正做的只是在我們自己的Add實現中用這個額外的位在內部包裝一個Dictionary。再次,這看起來像很多代碼,但你會看到它是非常單調無聊的東西。

public class ConnectionStringSettingsCollection : IDictionary<String, ConnectionStringSettings> 
{ 
    private readonly Dictionary<String, ConnectionStringSettings> m_ConnectionStrings; 

    public ConnectionStringSettingsCollection() 
    { 
     m_ConnectionStrings = new Dictionary<String, ConnectionStringSettings>(); 
    } 

    public ConnectionStringSettingsCollection(int capacity) 
    { 
     m_ConnectionStrings = new Dictionary<String, ConnectionStringSettings>(capacity); 
    } 

    #region IEnumerable methods 
    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return ((IEnumerable)m_ConnectionStrings).GetEnumerator(); 
    } 
    #endregion 

    #region IEnumerable<> methods 
    IEnumerator<KeyValuePair<String, ConnectionStringSettings>> IEnumerable<KeyValuePair<String, ConnectionStringSettings>>.GetEnumerator() 
    { 
     return ((IEnumerable<KeyValuePair<String, ConnectionStringSettings>>)m_ConnectionStrings).GetEnumerator(); 
    } 
    #endregion 

    #region ICollection<> methods 
    void ICollection<KeyValuePair<String, ConnectionStringSettings>>.Add(KeyValuePair<String, ConnectionStringSettings> item) 
    { 
     ((ICollection<KeyValuePair<String, ConnectionStringSettings>>)m_ConnectionStrings).Add(item); 
    } 

    void ICollection<KeyValuePair<String, ConnectionStringSettings>>.Clear() 
    { 
     ((ICollection<KeyValuePair<String, ConnectionStringSettings>>)m_ConnectionStrings).Clear(); 
    } 

    Boolean ICollection<KeyValuePair<String, ConnectionStringSettings>>.Contains(KeyValuePair<String, ConnectionStringSettings> item) 
    { 
     return ((ICollection<KeyValuePair<String, ConnectionStringSettings>>)m_ConnectionStrings).Contains(item); 
    } 

    void ICollection<KeyValuePair<String, ConnectionStringSettings>>.CopyTo(KeyValuePair<String, ConnectionStringSettings>[] array, Int32 arrayIndex) 
    { 
     ((ICollection<KeyValuePair<String, ConnectionStringSettings>>)m_ConnectionStrings).CopyTo(array, arrayIndex); 
    } 

    Boolean ICollection<KeyValuePair<String, ConnectionStringSettings>>.Remove(KeyValuePair<String, ConnectionStringSettings> item) 
    { 
     return ((ICollection<KeyValuePair<String, ConnectionStringSettings>>)m_ConnectionStrings).Remove(item); 
    } 

    public Int32 Count => ((ICollection<KeyValuePair<String, ConnectionStringSettings>>)m_ConnectionStrings).Count; 
    public Boolean IsReadOnly => ((ICollection<KeyValuePair<String, ConnectionStringSettings>>)m_ConnectionStrings).IsReadOnly; 
    #endregion 

    #region IDictionary<> methods 
    public void Add(String key, ConnectionStringSettings value) 
    { 
     // NOTE only slight modification, we add back in the Name of connectionString here (since it is the key) 
     value.Name = key; 
     m_ConnectionStrings.Add(key, value); 
    } 

    public Boolean ContainsKey(String key) 
    { 
     return m_ConnectionStrings.ContainsKey(key); 
    } 

    public Boolean Remove(String key) 
    { 
     return m_ConnectionStrings.Remove(key); 
    } 

    public Boolean TryGetValue(String key, out ConnectionStringSettings value) 
    { 
     return m_ConnectionStrings.TryGetValue(key, out value); 
    } 

    public ConnectionStringSettings this[String key] 
    { 
     get => m_ConnectionStrings[key]; 
     set => Add(key, value); 
    } 

    public ICollection<String> Keys => m_ConnectionStrings.Keys; 
    public ICollection<ConnectionStringSettings> Values => m_ConnectionStrings.Values; 
    #endregion 
} 

一些簡單的擴展方法,使事情變得更簡單。

public static class ConnectionStringSettingsExtensions 
{ 
    public static ConnectionStringSettingsCollection ConnectionStrings(this IConfigurationRoot configuration, String section = "ConnectionStrings") 
    { 
     var connectionStringCollection = configuration.GetSection(section).Get<ConnectionStringSettingsCollection>(); 
     if (connectionStringCollection == null) 
     { 
      return new ConnectionStringSettingsCollection(); 
     } 

     return connectionStringCollection; 
    } 

    public static ConnectionStringSettings ConnectionString(this IConfigurationRoot configuration, String name, String section = "ConnectionStrings") 
    { 
     ConnectionStringSettings connectionStringSettings; 

     var connectionStringCollection = configuration.GetSection(section).Get<ConnectionStringSettingsCollection>(); 
     if (connectionStringCollection == null || 
      !connectionStringCollection.TryGetValue(name, out connectionStringSettings)) 
     { 
      return null; 
     } 

     return connectionStringSettings; 
    } 
} 

最後的用法。

var configuration = new ConfigurationBuilder() 
    .AddJsonFile("config.json") 
    .Build(); 

var connectionStrings = configuration.ConnectionStrings(); 

foreach (var connectionString in connectionStrings.Values) 
{ 
    Console.WriteLine(connectionString.Name); 
    Console.WriteLine(connectionString.ConnectionString); 
    Console.WriteLine(connectionString.ProviderName); 
} 

var specificConnStr1 = connectionStrings["Test1"]; 
Console.WriteLine(specificConnStr1.Name); 
Console.WriteLine(specificConnStr1.ConnectionString); 
Console.WriteLine(specificConnStr1.ProviderName); 

var specificConnStr2 = configuration.ConnectionString("Test2"); 
Console.WriteLine(specificConnStr2.Name); 
Console.WriteLine(specificConnStr2.ConnectionString); 
Console.WriteLine(specificConnStr2.ProviderName); 
0

喜歡的東西:

var configurationRoot = new ConfigurationBuilder() 
       .SetBasePath(Directory.GetCurrentDirectory()) 
       .AddJsonFile("appsettings.json", false) 
       .Build(); 

var conString = configurationRoot["ConnectionStrings:MyConnection"]); 
相關問題