.NET Core从appsettings.json获取连接字符串

A. *_*kiy 18 c# .net-core asp.net-core

我开发了一个简单的Web应用程序,并且在将来,我希望将其作为多租户来实现.

所以我想直接将连接字符串写入OnConfiguring方法:

public class ApplicationContext : DbContext
{
    public DbSet<User> Users { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer("connection string from appsettings.json");
        base.OnConfiguring(optionsBuilder);
    }
}
Run Code Online (Sandbox Code Playgroud)

启动课程:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationContext>();
    services.AddMvc();
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能从中提取连接字符串appsettings.jsonApplicationContext类?

我不想为ApplicationContext类创建任何构造函数.

Gle*_*nov 17

让我们假设你有.NET Core应用程序,你的appsettings.json文件看起来像这样:

{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    }
  },
  "Production": {
    "SqliteConnectionString": "Filename=./MyDatabase.sqlite"
  }
}
Run Code Online (Sandbox Code Playgroud)

你可以SqliteConnectionStringStartup.cs这样得到价值:

public void ConfigureServices(IServiceCollection services)
{
    var connection = Configuration["Production:SqliteConnectionString"];

    services.AddDbContext<MyContext>(options =>
        options.UseSqlite(connection)
    );
    ....
 }
Run Code Online (Sandbox Code Playgroud)

然后在DBContext你的应该添加接受的构造函数DbContextOptions:

public class MyContext : DbContext
{
    public MyContext (DbContextOptions<MyContext> options) : base(options)
    { }

    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 如果我想为`MyContext`使用无参数构造函数怎么办? (3认同)
  • 很好。但是如何将相同的字符串放入“ApplicationContext”类中?我不能按照你写的那样去做。 (2认同)

Tad*_*dej 9

.NET 核心 2.0

添加这个类:

// Requires NuGet package Microsoft.Extensions.Configuration.Json

using Microsoft.Extensions.Configuration;
using System.IO;

namespace RutarBackgroundServices.AppsettingsJson
{
    public static class AppSettingsJson
    {
        public static string ApplicationExeDirectory()
        {
            var location = System.Reflection.Assembly.GetExecutingAssembly().Location;
            var appRoot = Path.GetDirectoryName(location);

            return appRoot;
        }

        public static IConfigurationRoot GetAppSettings()
        {
            string applicationExeDirectory = ApplicationExeDirectory();

            var builder = new ConfigurationBuilder()
            .SetBasePath(applicationExeDirectory)
            .AddJsonFile("appsettings.json");

            return builder.Build();
        }


    }
}
Run Code Online (Sandbox Code Playgroud)

从“appsettings.json”文件中获取键“MssqlConnectionString”的值:

var appSettingsJson = AppSettingsJson.GetAppSettings();
var connectionString = appSettingsJson["MssqlConnectionString"];
Run Code Online (Sandbox Code Playgroud)

在项目的根目录中创建文件“appsettings.json”:

{
  "MssqlConnectionString": "Server=yourip; Database=yourdbname; User Id=yourusername; Password=yourpassword; Pooling=true;",
  "Db2ConnectionString": "Database=yourdbname;UserID=yourusername;Password=yourpassword;Server=yourip:yourport",
  "SomeOtherKey": "SomeOtherValue"
}
Run Code Online (Sandbox Code Playgroud)

  • 我在 .NET Core 2 应用程序中使用它解决了同样的问题,它非常完美。强烈推荐。 (2认同)
  • 最好使用“ConnectionStrings”部分,如下所示:{“ConnectionStrings”:{“MssqlConnectionString”:“Server = yourip;Database = yourdbname;User Id = yourusername;Password = yourpassword;Pooling = true;”,“Db2ConnectionString”:“数据库=yourdbname;UserID=yourusername;Password=yourpassword;Server=yourip:yourport", }, "SomeOtherKey": "SomeOtherValue"} (2认同)

Luk*_*wej 5

所以我想直接将连接字符串写入OnConfiguring方法:

如何从appsettings.json中提取连接字符串到ApplicationContext类?

我不想为ApplicationContext类创建任何构造函数.

你可以使用Options Pattern,IOptions但最简单的方法是在ApplicationContext构造函数中使用DI ;)

请按照以下文章: