Gereksinimler ve Ön Hazırlık
Projeye başlamadan önce geliştirme ortamınızın güncel olduğundan emin olmalısınız. 2026 yılı standartlarında bir C# uygulaması geliştirmek için aşağıdaki araçlara ihtiyacınız vardır:
- Visual Studio 2022 (veya üzeri) veya VS Code.
- .NET 9 SDK: Modern asenkron programlama ve performans iyileştirmeleri için gereklidir.
- Newtonsoft.Json veya System.Text.Json kütüphanesi: API'den gelen verileri işlemek için kullanılır.
- Entity Framework Core: Portföy verilerini SQLite veya SQL Server üzerinde tutmak için tercih edilir.
- CoinGecko veya Binance API Anahtarı: Piyasa verilerine erişim sağlamak için ücretsiz bir API anahtarı temin etmelisiniz.
Projeyi oluşturmak için terminalinize dotnet new console -n KriptoPortfoyTakip komutunu yazarak başlayabilirsiniz. Bu komut, uygulamanızın temel iskeletini oluşturacaktır.
API Entegrasyonu ve Veri Çekme İşlemleri
Kripto para piyasası verileri, dış servislerden gelen JSON formatındaki metinlerle sağlanır. C# içerisinde HttpClient sınıfını kullanarak bu verileri güvenli bir şekilde çekebiliriz. Aşağıdaki kod bloğu, belirli bir kripto paranın anlık fiyatını nasıl çekeceğinizi göstermektedir.
using System.Net.Http.Json;
public class KriptoServis
{
private readonly HttpClient _httpClient = new HttpClient();
public async Task FiyatGetir(string coinId)
{
// CoinGecko API örneği
var url = $"https://api.coingecko.com/api/v3/simple/price?ids={coinId}&vs_currencies=try";
var sonuc = await _httpClient.GetFromJsonAsync(url);
return sonuc[coinId]["try"];
}
}
Bu kodda HttpClient sınıfını kullanarak asenkron bir istek gönderiyoruz. GetFromJsonAsync metodu, gelen JSON verisini doğrudan C# nesnesine dönüştürerek hata payını azaltır. async/await yapısı, veriler çekilirken uygulamanın donmasını engeller.
Veri Modeli ve Portföy Yapısı
Uygulamanızın temelini oluşturacak olan PortfoyItem sınıfını tanımlamalıyız. Bu sınıf, kullanıcının elinde tuttuğu varlığın miktarını ve sembolünü temsil eder. Veritabanı tutarlılığı için bu modelin temiz olması kritiktir.
public class PortfoyItem
{
public int Id { get; set; }
public string Sembol { get; set; } = string.Empty;
public decimal Miktar { get; set; }
public decimal AlisFiyati { get; set; }
}
Bu model, Entity Framework Core ile veritabanına kaydedilecek temel yapıdır. Sembol alanı, API'den veri çekerken kullanılacak anahtar değerdir.
Veritabanı Yönetimi ve Entity Framework Core
Verilerin kalıcı olması için bir veritabanı bağlamı (DbContext) oluşturmalıyız. SQLite, küçük ölçekli portföy uygulamaları için idealdir çünkü kurulum gerektirmez ve tek bir dosya üzerinde çalışır.
using Microsoft.EntityFrameworkCore;
public class PortfoyDbContext : DbContext
{
public DbSet Portfoy { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options.UseSqlite("Data Source=portfoy.db");
}
Bu yapılandırma ile Portfoy tablosu üzerinden verilerinizi ekleyebilir, güncelleyebilir ve silebilirsiniz. OnConfiguring metodu, uygulamanın veritabanı dosyasını nerede arayacağını belirtir.
Portföy Değerleme Mantığı
Kullanıcının toplam varlığının TL cinsinden değerini hesaplamak için, veritabanındaki her bir varlığı döngüye alıp güncel fiyatla çarpmamız gerekir. Bu işlem, uygulamanızın en kritik hesaplama kısmıdır.
public async Task ToplamDegerHesapla(List varliklar)
{
decimal toplam = 0;
var servis = new KriptoServis();
foreach (var varlik in varliklar)
{
var guncelFiyat = await servis.FiyatGetir(varlik.Sembol);
toplam += guncelFiyat * varlik.Miktar;
}
return toplam;
}
Burada her varlık için ayrı bir API isteği atılmaktadır. Ancak çok sayıda varlığınız varsa, API limitlerine takılmamak için toplu veri çeken uç noktaları (batch request) kullanmanız önerilir.
Uygulama Karşılaştırma Tablosu
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| SQLite | Hızlı, kurulumsuz, taşınabilir | Çok kullanıcılı sistemlerde yavaş |
| SQL Server | Kurumsal ölçeklenebilirlik | Kurulum ve yönetim maliyeti |
| JSON Dosyası | Basit, hızlı prototipleme | Veri bütünlüğü riski yüksek |
Kritik Güvenlik Uyarısı: API anahtarlarınızı hiçbir zaman kod içerisinde "hard-coded" (doğrudan metin olarak) bırakmayın. Ortam değişkenlerini (Environment Variables) veya appsettings.json dosyasını kullanarak anahtarlarınızı şifreli bir şekilde saklayın. Aksi takdirde, kodunuzu GitHub gibi platformlara yüklerseniz anahtarınız çalınabilir.
Sıkça Sorulan Sorular
API'den gelen veriler neden hatalı görünüyor?
API'den gelen verilerin null olup olmadığını kontrol edin. Ayrıca, kullandığınız API'nin limitlerini (rate limiting) aşmış olabilirsiniz. try-catch blokları ile hata yönetimini mutlaka ekleyin.
Uygulamayı nasıl daha hızlı hale getirebilirim?
Her varlık için ayrı API isteği atmak yerine, toplu fiyat bilgisi sağlayan uç noktaları kullanın. Ayrıca, verileri bellekte (cache) belirli bir süre tutarak gereksiz istekleri engelleyin.
Veritabanı bağlantısı neden başarısız oluyor?
Entity Framework Core kullanırken dotnet ef migrations add InitialCreate ve dotnet ef database update komutlarını çalıştırdığınızdan emin olun. Bu, veritabanı şemasının oluşturulmasını sağlar.
Neden SQLite tercih etmeliyim?
Kişisel bir portföy uygulaması için sunucu yönetimiyle uğraşmak istemezsiniz. SQLite, dosya tabanlı olduğu için uygulamanızın yedeğini almak sadece bir dosyayı kopyalamak kadar kolaydır.
Uygulama güvenliğini nasıl artırabilirim?
Kullanıcı girişleri ekleyecekseniz şifreleri asla düz metin olarak saklamayın. BCrypt.Net kütüphanesini kullanarak şifreleri hash'leyerek (karma hale getirerek) veritabanına kaydedin.
Finansal Sorumluluk Reddi: Bu makale tamamen yazılım geliştirme tekniklerini öğretmeyi amaçlamaktadır. Uygulamanızın hesapladığı veriler, piyasa dalgalanmaları ve API gecikmeleri nedeniyle farklılık gösterebilir. Bu uygulama herhangi bir yatırım tavsiyesi değildir ve finansal kararlarınızda kullanılamaz.
Uygulama Performansını Artırmak İçin İleri Düzey Önbellekleme Stratejileri
Kripto para portföy uygulamalarında en büyük darboğaz, her veri çekme isteğinde dış API'ye yapılan çağrılardır. API sağlayıcılarının genellikle hız sınırlamaları (rate limiting) olduğu düşünülürse, IMemoryCache kullanarak verileri bellekte tutmak uygulamanızın yanıt süresini milisaniyelere indirecektir.
Aşağıdaki örnekte, fiyat verilerini 60 saniye boyunca bellekte tutan ve API yükünü azaltan bir servis yapısını görebilirsiniz:
using Microsoft.Extensions.Caching.Memory;
public class CryptoPriceService
{
private readonly IMemoryCache _cache;
private const string CacheKey = "CryptoPrices";
public CryptoPriceService(IMemoryCache cache)
{
_cache = cache;
}
public async Task GetPriceAsync(string symbol)
{
if (!_cache.TryGetValue(CacheKey, out Dictionary prices))
{
// API'den veriyi çek
prices = await FetchPricesFromApi();
var cacheOptions = new MemoryCacheEntryOptions()
.SetAbsoluteExpiration(TimeSpan.FromSeconds(60));
_cache.Set(CacheKey, prices, cacheOptions);
}
return prices[symbol];
}
}
Uygulamanın Dağıtımı (Deployment) ve Docker Entegrasyonu
Geliştirdiğiniz C# uygulamasını yerel makinenizden çıkarıp sunucu ortamına taşırken, bağımlılıkları yönetmek için Docker kullanmak en profesyonel yaklaşımdır. Bu sayede veritabanı sürücüleri veya .NET çalışma zamanı uyumsuzlukları gibi sorunları ortadan kaldırırsınız.
Uygulamanız için temel bir Dockerfile yapısı şu şekilde olmalıdır:
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /app
COPY . .
RUN dotnet publish -c Release -o out
FROM mcr.microsoft.com/dotnet/runtime:8.0
WORKDIR /app
COPY --from=build /app/out .
ENTRYPOINT ["dotnet", "CryptoPortfolioApp.dll"]
Deployment Öncesi Kontrol Listesi
- Environment Variables: API anahtarlarınızı asla kod içinde saklamayın;
appsettings.jsonyerine ortam değişkenlerini (Environment Variables) kullanın. - Logging: Uygulamanın arka planda ne yaptığını takip etmek için
Seriloggibi bir kütüphane ile loglama mekanizması kurun. - Database Migration: Uygulama ilk kez çalıştığında veritabanı şemasının otomatik oluşması için
context.Database.Migrate();komutunu program başlangıcına ekleyin.
Hata Ayıklama ve İzlenebilirlik (Debugging)
Portföy uygulamalarında en sık karşılaşılan hata, API'den gelen JSON verisinin model ile eşleşmemesidir. Bu tür durumları izlemek için System.Text.Json kütüphanesinin hata ayıklama özelliklerinden faydalanın. Eğer API yanıtı beklediğinizden farklı geliyorsa, ham yanıtı bir dosyaya yazdırarak incelemek sorunu hızla çözmenizi sağlar.
İpucu: API çağrılarınızdaHttpClientnesnesini her seferinde oluşturmak yerineIHttpClientFactorykullanarak soket tükenmesi (socket exhaustion) sorunlarının önüne geçin.
Sonuç
C# ile özel bir kripto para portföy takip uygulaması geliştirmek, modern .NET ekosisteminin gücünü ve esnekliğini anlamak için harika bir projedir. Bu rehberde; API entegrasyonu, veritabanı yönetimi ve asenkron programlama temellerini ele aldık. Uygulamanızı bir sonraki aşamaya taşımak için bir arayüz (WPF veya Blazor) eklemeyi düşünebilirsiniz. Yazılım dünyasında öğrenme süreci hiç bitmez; bir sonraki adımınız, uygulamanıza fiyat alarmı kurma özelliği eklemek veya verileri görselleştiren grafik kütüphanelerini entegre etmek olabilir.


Yorumlar (0)
Yorum Yaz