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 |
|
|
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