wake-up-neo.net

.NET Core holt die Verbindungszeichenfolge von appsettings.json

Ich entwickle eine einfache Web-App und möchte dies in der Zukunft als Multi-Tenancy tun.

Ich möchte also die Verbindungszeichenfolge direkt in die OnConfiguring-Methode schreiben:

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);
    }
}

Startup-Klasse:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationContext>();
    services.AddMvc();
}

Wie kann ich eine Verbindungszeichenfolge aus appsettings.json in die ApplicationContext-Klasse extrahieren?

Ich möchte keine Konstruktoren für die ApplicationContext-Klasse erstellen.

15
A. Gladkiy

Daher möchte ich die Verbindungszeichenfolge direkt in die OnConfiguring-Methode schreiben:

Wie kann ich eine Verbindungszeichenfolge aus appsettings.json in die ApplicationContext-Klasse extrahieren?

Ich möchte keine Konstruktoren für die ApplicationContext-Klasse erstellen.

Sie können Options Pattern über IOptions verwenden, aber die einfachste Möglichkeit ist DI in ApplicationContext constructor;

Bitte folgen Sie den folgenden Artikeln:

7
Lukasz Makowej

Stellen wir uns vor, Sie haben .NET Core application und Ihre appsettings.json-Datei sieht folgendermaßen aus:

{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    }
  },
  "Production": {
    "SqliteConnectionString": "Filename=./MyDatabase.sqlite"
  }
}

Sie können SqliteConnectionString value von Startup.cs wie folgt erhalten:

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

    services.AddDbContext<MyContext>(options =>
        options.UseSqlite(connection)
    );
    ....
 }

Und dann sollten Sie in Ihrer DBContext einen Konstruktor hinzufügen, der DbContextOptions akzeptiert:

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

    ...
}
10
Gleb Filimonov

.NET Core 2.0

Diese Klasse hinzufügen:

// 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();
        }


    }
}

Rufen Sie den Wert für den Schlüssel "MssqlConnectionString" aus der Datei "appsettings.json" ab:

var appSettingsJson = AppSettingsJson.GetAppSettings();
var connectionString = appSettingsJson["MssqlConnectionString"];

Erstellen Sie die Datei "appsettings.json" im Stammverzeichnis Ihres Projekts:

{
  "MssqlConnectionString": "Server=yourip; Database=yourdbname; User Id=yourusername; Password=yourpassword; Pooling=true;",
  "Db2ConnectionString": "Database=yourdbname;UserID=yourusername;Password=yourpassword;Server=yourip:yourport",
  "SomeOtherKey": "SomeOtherValue"
}
3
JedatKinports

Sie können das Factory-Muster verwenden, um Ihre DbContext aufzulösen.

public interface ITenantDbContextFactory
{
    ApplicationContext Create(string tenantId);
}

public class TenantDbContextFactory()
{
    private ApplicationContext context;

    public TenantDbContextFactory()
    {
    }

    public ApplicationContext Create(string tenantId) 
    {
        if(this.context==null) 
        {
            var connectionString = GetConnectionForTenant(tenantId);
            var dbContextBuilder = new DbContextOptionsBuilder();
            dbContextBuilder.UseSqlServer(connectionString);

            this.context = new ApplicationContext(dbContextBuilder);
        }

        return this.context;
    }
}

Beim Start:

services.AddDbContext<ApplicationContext>();
services.AddScoped<ITenantDbContextFactory, TenantDbContextFactory>();

Ihr Service oder Controller:

public class HomeController 
{
    private readonly ITenantDbContextFactory dbFactory;
    public HomeControler(ITenantDbContextFactory tenantDbContextFactory)
    {
        this.dbFactory = tenantDbContextFactory;
    }

    public void Action()
    {
        var dbContext = this.dbFactory.Create("tenantA");
        // use your context here
        dbContext...
    }
}
0
Tseng