2017-07-28 60 views
0

所以,我們通常會有些模型是否有可能綁定配置無國籍/只讀模型對.NET核心

public class ConnectionStrings 
{ 
    public string Sql { get; set; } 
    public string NoSql { get; set; } 
} 

那麼我們有東西在appsettings.json如下:

"ConnectionStrings": { 
    "Sql": "some connection string", 
    "NoSql": "some other connection string" 
} 

然後我綁定模型如下:

services.Configure<ConnectionStrings>(
      options => Configuration.GetSection("ConnectionStrings").Bind(options)); 

所有的作品完美,但它沒有任何意義我的模型是因爲它具有重要的信息,而且所有配置都是靜態信息,所以一旦閱讀我的模型應該保持原樣。 有沒有其他方法可以做到這一點更安全?

+0

我會擔心,以前改變從''int' NoSql'的類型爲'string'。 – stybl

+0

這只是一個例子,無論如何,感謝您的更正。 – kuskmen

回答

1

這樣的代碼使用引擎蓋下一個期望的公共屬性的ConfigurationBinder。從BindProperty method

// We don't support set only, non public, or indexer properties 
if (property.GetMethod == null || 
    !property.GetMethod.IsPublic || 
    property.GetMethod.GetParameters().Length > 0) 
{ 
    return; 
} 

作爲一種解決辦法,我建議手動填充類。以下面爲例:

public class ConnectionStrings 
{ 
    public ConnectionStrings(string sql, string noSql) 
    { 
     Sql = sql; 
     NoSql = noSql; 
    } 

    public string Sql { get; private set; } 
    public string NoSql { get; private set; } 
} 

,然後在ConfigureServices方法:

var sqlValue = Configuration.GetValue<string>("ConnectionStrings:Sql", string.Empty); 
var noSqlValue = Configuration.GetValue<string>("ConnectionStringsApp:NoSql", string.Empty); 

services.Configure<ConnectionStrings>(
      options => new ConnectionStrings(sqlValue, noSqlValue)); 
+0

太棒了,我會這麼做的,謝謝!只是一件事,我寧願在沒有setter的情況下創建屬性,並將它們設置在構造函數中以模擬完全只讀行爲,因爲將它們留給私有集合意味着此類可能稍後會再次更改它們,而我想明確地表示這是隻讀的屬性。 :) – kuskmen

-1

我的實現有一個每個環境的配置文件,第二個配置文件存儲所有環境的選項。連接字符串與其他選項一起存儲在不同的部分中。我使用以下方法加載兩個配置文件,然後將我的連接字符串直接附加到DbContext。

我已經把代碼的不相關部分切掉了。

Startup.cs

using Microsoft.AspNetCore.Hosting; 
using Microsoft.EntityFrameworkCore; 
using Microsoft.Extensions.Configuration; 
using Microsoft.Extensions.DependencyInjection; 

public class Startup 
{ 
    public static IConfigurationRoot Configuration { get; private set; } 

    public Startup(IHostingEnvironment env) { 
     var builder = new ConfigurationBuilder() 
      .SetBasePath(env.ContentRootPath) 
      .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) 
      .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true); 

     builder.AddEnvironmentVariables(); 
     Configuration = builder.Build(); 
    } 

    public void ConfigureServices(IServiceCollection services) { 
     // Add MVC, Authorization, etc. 
     services.AddDbContext<MyDbContext>(options => 
      options.UseSqlServer(Configuration.GetConnectionString("MyConnection"))); 
    } 
} 

appsettings.production.json

{ 
    "ConnectionStrings": { 
    "MyConnection": "Data Source=mydb.myserver.com;Initial Catalog=mydb;Persist Security Info=True;User ID=sqluser;Password=sqlpwd;" 
    } 
    "Settings": { 
    "Setting1": "Value1" 
    } 
} 
+0

這完全不是問什麼問題。他希望配置類的屬性在設置後不能更改。 – mason

+0

他想加載連接字符串。我舉例說明,您不需要構建Model類來存儲信息,並且通過使用Dependency Injection,Startup之外的任何代碼都不必關心連接字符串。我演示瞭如何加載配置而不綁定到可變模型。 –

+0

更不用說,在代碼中,我有配置對象與'私人集',所以它不能在啓動以外修改。然後,您可以使用DI將您的配置粘貼到任何您想要的控制器上。這仍然沒有回答如何加載配置的問題嗎? SO上的每個人都非常渴望冷靜下來,沒有任何積極的貢獻。這就是爲什麼我在這裏潛伏多年才終於註冊。 –

相關問題