MVC Core 3 için Appsettings.Json Path Değişikliği

Çoğunlukla Startup.cs içinden DbContext konfigürasyonu yaparız. Aşağıdakine benzer bir kod ile API yada sunum kütüphanemiz içindeki appsettings.json dosyasını okuyarak bağlantı için ConnectionString dizemizi elde ederiz.

 

Örnek Statup.cs Context 

public void ConfigureServices(IServiceCollection services)
{
        services.AddDbContext<MyDBContext>(options => options.UseSqlServer(_configuration.GetConnectionString("DefaultConnection")));
}

Fakat bağlantı dizesinin sunum katmanında olması SOLID prensipleri gereği çok anlamlı değildir. Birden fazla bağlantı dizemiz varsa  farklı veritabanlarına bağlanmak istersek bunların tümünün Startup.cs altından configure edilmesi hoş olmayacaktır.

Önce aşağıdaki gibi iki farklı veritabanı ConnectionStrings bilgisi içeren appsettings.json dosyamızı API klasörümüzden taşıyarak DataAccess katmanına ait klasöre kopyalayalım.

{
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "DefaultConnection": "Server=.;Database=MyLocalDB;Trusted_Connection=True;MultipleActiveResultSets=true;",
    "NpgsqlConnection": "Host=192.168.XX.XX;Database=MyERP;Port=5432;Username=postgresDBA;Password=admin1xx;"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  }

Daha sonra Program.cs içine giderek yeni konfigurasyon ayarımızı belirtelim.

//Yeni pathi verecek olan metod
public static string MyAppSettingsPath()
       {
           string myAppPath = AppDomain.CurrentDomain.BaseDirectory;
           myAppPath = myAppPath.Replace("Projem.API", "Projem.DataAccess");
 
           return myAppPath;
       }
 //Konfigurasyon satırlarımız.
 //İsterseniz appsettings.json u farklı isimle kayıt edip yeni isim belirtebilirsiniz. 
 //Örn: Myappsettings.json gibi
       public static IHostBuilder CreateHostBuilder(string[] args) =>
           Host.CreateDefaultBuilder(args)
               .ConfigureAppConfiguration((hostingContext, config) =>
               {
                   config.SetBasePath(MyAppSettingsPath())
                   .AddJsonFile("appsettings.json", optional: false, reloadOnChange: false);
               })
               .ConfigureWebHostDefaults(webBuilder =>
               {
                   webBuilder.UseStartup<Startup>();
               });

Program seviyesinde artık yeni verdiğimiz path üzerinden ayarlar okunacaktır.

Birde DBContext içinde burayı ezecek koda örnek verelim. Olur da bazı projelerinizde yeni path içindeki appsettings.json'u kullanmak istemeyebilirsiniz. Bunun için ilgili DBContext.cs içinde OnConfiguring override yapmanız gerekiyor.

 

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            //Path değerini string ifade şeklindede yazabilirsiniz. Örn: C:\Proje\MySolutions\Other.DataAccess            
            string appPath = AppDomain.CurrentDomain.BaseDirectory; 
 
            IConfigurationRoot configuration = new ConfigurationBuilder()
            .SetBasePath(appPath)
            .AddJsonFile("appsettings.json") 
            .Build();
            optionsBuilder.UseSqlServer(configuration.GetConnectionString("DefaultConnection"));

           //appsettings.json ile işim yok, doğrudan ConnectionStringi ben vereceğim diyorsanız.
           //Yukarıdaki satırları yoruma alıp sadece alttaki satırı işletmeniz yeterli olacaktır.
            optionsBuilder.UseNpgsql(@"Host=172.178.XX.XX;Port=5432;Command Timeout=3000;Username=postgresDBA;Password=admin1xx;Database=MyOtherERP;");

        }

Umarım faydalı olur.