Skip to content
Permalink
master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time
layout title date author comments category tags
post
Asp.Net Core uygulamalarında Environment (Ortam) bilgisine göre Database ConnectionString (Veritabanı Bağlantı Cümlesi) belirlemek
2018-01-21 14:00
engin.polat
true
Web
aspnetcore
database
connectionstring
environment
development
test
staging
production
dbcontext
dbset
configureservices
iservicecollection
adddbcontextpool
sqlconnectionstringbuilder
configuration
getconnectionstring
initialcatalog
isdevelopment
usesqlserver
appsettings

Geçen yıl geliştirmeye başladığımız birkaç bin adam/gün sürecek koca bir ERP uygulamasında, Web API projesinin yayınlandığı ortama göre Database ConnectionString'e (Veritabanı Bağlantı Cümlesi) sahip olması gerekiyordu.

Örneğin, ConnectionString, Development ortamında Development veritabanını, Test ortamında Test veritabanını, Staging ortamında Staging veritabanını, Production ortamında Production veritabanını göstermeliydi.

Eğer Asp.Net Core Web API uygulamasının, çalıştığı ortama göre (Environment) otomatik olarak ConnectionString bilgisini belirlemesini sağlayabilirsem, uygulamanın çeşitli ortamlara yayılması gerektiğinde, ConnectionString'i güncelleme derdinden kurtulabilirdim.

Hatta, her developerın bilgisayarının isminin de ConnectionString'te olmasını sağlayabilirsem, aynı anda geliştirme yapan birden fazla developer'ın, birbirlerinin veritabanı değişikliklerinden etkilenmesini de engelleyebilirdim.

Bunu gerçekleştirmek için, öncelikle projede yeni bir AppDataContext.cs dosyası oluşturdum ve Microsoft.EntityFrameworkCore kütüphanesini kullanarak veritabanını ve tabloları modelledim;

<script src="https://gist.github.com/polatengin/464d78a39de20e32bd4c33f62b847bbf.js?file=AppDataContext.cs"></script>

Startup.cs dosyasında yer alan ConfigureServices() methoduna aşağıdaki kodları yazdım;

<script src="https://gist.github.com/polatengin/464d78a39de20e32bd4c33f62b847bbf.js?file=ConfigureServices.cs"></script>

AddDbContextPool() methodu sayesinde, uygulamada AppDataContext sınıfı her gerektiğinde (Dependency Injection ve IoC - Inversion of Control yöntemleri ile) sağlanacak olan AppDataContext değişkenini yapılandırdım.

Burada dikkat edilmesi gereken nokta, SqlConnectionStringBuilder sınıfı sayesinde, varolan ConnectionString bilgisini değiştirip, yenisini oluşturabiliyoruz.

Environment bilgilerini kullanıp, hatta IsDevelopment() methodu ile gerekirse developer bilgisayarının ismini de kullanıp, yeni ConnectionString ürettim ve bu ConnectionString'i UseSqlServer() methodu içerisinde kullandım.

Böylece farklı ortamlarda (Environment) ConnectionString aşağıdakiler gibi oldu;

  • Database_Production
  • Database_Test
  • Database_Staging
  • Database_Development_Ahmet
  • Database_Development_Mehmet
  • Database_Development_Ayse

Son olarak, AppConnectionString değişkenini, appsettings.json dosyası içerisinde aşağıdaki gibi tanımladım;

<script src="https://gist.github.com/polatengin/464d78a39de20e32bd4c33f62b847bbf.js?file=appsettings.json"></script>

Not : Bu makaleyi yazarken Martin Ullrich'in makalesinden de faydalandım