2016-08-22 140 views
36

我想读只是从一个配置文件中,因为这是一个连接字符串名为“AppAettings.json”将文件添加到我的项目,并添加就可以了这一内容:如何在.NET Core中读取连接字符串?

{ 
"ConnectionStrings": { 
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet- 

WebApplica71d622;Trusted_Connection=True;MultipleActiveResultSets=true" 
    }, 
    "Logging": { 
    "IncludeScopes": false, 
    "LogLevel": { 
    "Default": "Debug", 
    "System": "Information", 
    "Microsoft": "Information" 
    } 
} 
} 

在ASP.NET我用这个:

var temp=ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString; 

现在我怎么能读取C#中的“DefaultConnection”,并将其存储在.NET核心中的字符串变量?

+0

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration –

回答

26

您可以用GetConnectionString扩展法做到这一点:

string conString = Microsoft 
    .Extensions 
    .Configuration 
    .ConfigurationExtensions 
    .GetConnectionString(this.Configuration, "DefaultConnection"); 

System.Console.WriteLine(conString); 

或结构类对于DI:

public class SmtpConfig 
{ 
    public string Server { get; set; } 
    public string User { get; set; } 
    public string Pass { get; set; } 
    public int Port { get; set; } 
} 

启动:

public IConfigurationRoot Configuration { get; } 


// This method gets called by the runtime. Use this method to add services to the container. 
public void ConfigureServices(IServiceCollection services) 
{ 
    // http://developer.telerik.com/featured/new-configuration-model-asp-net-core/ 
    // services.Configure<SmtpConfig>(Configuration.GetSection("Smtp")); 
    Microsoft.Extensions.DependencyInjection.OptionsConfigurationServiceCollectionExtensions.Configure<SmtpConfig>(services, Configuration.GetSection("Smtp")); 

然后在家里控制器:

public class HomeController : Controller 
{ 

    public SmtpConfig SmtpConfig { get; } 
    public HomeController(Microsoft.Extensions.Options.IOptions<SmtpConfig> smtpConfig) 
    { 
     SmtpConfig = smtpConfig.Value; 
    } //Action Controller 


    public IActionResult Index() 
    { 
     System.Console.WriteLine(SmtpConfig); 
     return View(); 
    } 

与这appsettings.json:

"ConnectionStrings": { 
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=aspnet-WebApplica71d622;Trusted_Connection=True;MultipleActiveResultSets=true" 
}, 

"Smtp": { 
    "Server": "0.0.0.1", 
    "User": "[email protected]", 
    "Pass": "123456789", 
    "Port": "25" 
    } 
+1

'Configure'是扩展方法。应该最常用的是这样的:'services.Configure (Configuration.GetSection(“SMTP”));'当然,这是同样的事情,但我认为人们不知道会刚开始做“错”的方式,使用未注释的行,所以也许最好删除行。 ;) –

+0

@詹姆斯威尔金斯:非常有效的担忧。不过,其实我更喜欢这个符号在使用它作为扩展方法 - 这样,我知道正在做什么,在哪里,并能复制粘贴从1处到另一处,没有得到由于缺少进口的命名空间的问题。唯一的问题是,MS使用名称空间进行分类,而不是使用名称冲突防护 - 因此,名称空间太长。另外,如果您删除namspaces并使用扩展方法,那么相同类型的人将开始抱怨代码没有编译。不是每个人都使用IDE,所以这种方式更好。 –

+0

我发现大多数人都不会刻意去把“usings”在他们的代码示例,这是您点的情况下,也是为什么扩展方法失败的另一点。 ;) –

1

,我找到了解决这个是使用的方式在Startup的构建器中添加JsonFile(允许它找到存储在appsettings.json文件中的配置),然后使用它来设置私有_config变量

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) 
      .AddEnvironmentVariables(); 
     _config = builder.Build(); 
    } 

然后我可以设置配置字符串如下:

var connectionString = _config.GetConnectionString("DbContextSettings:ConnectionString"); 

这是DOTNET核心1.1

+4

如何在我的控件中访问_config? – sunny

+0

将它添加到Startup.cs的ConfigureServices中的DI容器中。 –

26

张贴的答案是好的,但并没有直接回答同样的问题,我对读取连接字符串。通过大量搜索,我找到了一个更简单的方法。

In Startup。CS

public void ConfigureServices(IServiceCollection services) 
{ 
    ... 
    // Add the whole configuration object here. 
    services.AddSingleton<IConfiguration>(Configuration); 
} 

在您的控制器构造函数在视图中添加代码的配置和现场参数为它吧

private readonly IConfiguration configuration; 

public HomeController(IConfiguration config) 
{ 
    configuration = config; 
} 

后,你可以访问它想:

connectionString = configuration.GetConnectionString("DefaultConnection"); 
1

查看链接了解更多信息: https://docs.microsoft.com/en-us/ef/core/miscellaneous/connection-strings

JSON

{ 
     "ConnectionStrings": { 
     "BloggingDatabase": "Server=(localdb)\\mssqllocaldb;Database=EFGetStarted.ConsoleApp.NewDb;Trusted_Connection=True;" 
     }, 
    } 

C#Startup.cs

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddDbContext<BloggingContext>(options => 
     options.UseSqlServer(Configuration.GetConnectionString("BloggingDatabase"))); 
}