C# Full AOT Sql Service
SqlService - AOT Uyumlu MSSQL Servis Kütüphanesi
SqlService - AOT Uyumlu MSSQL Hizmet Kütüphanesi
.NET 10.0 ile oluşturulmuş, tam AOT (Önceden Derleme) ve kırpma desteği sunan, yüksek performanslı, üretime hazır, reflection içermeyen MSSQL Hizmet Library'si.
✨ Özellikler
- ✅ %100 AOT Uyumlu: Sıfır yansıma, Yerel AOT derlemesiyle tam uyumlu
- ✅ Tam Trimming Desteği: Kullanılmayan kodların kaldırılmasıyla dağıtım boyutu optimize edildi
- ✅ Tek Arayüz Erişimi: Tüm SQL işlemleri tek bir
ISqlService<T>arayüzü üzerinden gerçekleştirilir - ✅ Toplu İşlemler: Yüksek performanslı toplu ekleme, güncelleme ve silme işlemleri
- ✅ Tip Güvenliği: Genel kısıtlamalar derleme zamanında tip güvenliğini sağlar
- ✅ Temiz Mimari: Katmanlı tasarım (Çekirdek, Altyapı, Eklentiler)
- ✅ Bağlantı Havuzu Yönetimi: Dahili bağlantı havuzu yönetimi
- ✅ Günlük Kaydı Desteği: Microsoft.Extensions.Logging ile entegre
- ✅ Hata Ayıklama PDB'si Yok: Sürüm derlemeleri hata ayıklama sembollerini hariç tutar
🚀 Performans
| İşlem | Hedef | Notlar |
|---|---|---|
| Toplu Ekleme (10 bin satır) | < 100 ms | SqlBulkCopy tabanlı |
| Toplu Güncelleme (10 bin satır) | < 200 ms | MERGE ifadesi optimize edilmiş |
| Toplu Silme (10 bin satır) | < 150ms | Toplu işlemle IN cümlesi |
| Tekli GetById | < 10ms | Dizinlenmiş, havuzlanmış bağlantılar |
| DLL Boyutu (Kısaltılmış) | < 500KB | Tam kısaltma etkinleştirilmiş |
📦 Installation
dotnet add package SqlService
🔧 Configuration
appsettings.json
{
"SqlService": {
"ConnectionString": "Server=localhost;Database=YourDatabase;User Id=sa;Password=YourPassword;Encrypt=true;TrustServerCertificate=true;",
"CommandTimeout": 300,
"BatchInsertSize": 1000,
"BatchUpdateSize": 500,
"BatchDeleteSize": 2000,
"EnableConnectionPooling": true,
"MaxPoolSize": 100,
"MinPoolSize": 5,
"EnableLogging": true
}
}
Program.cs (Dependency Injection)
using SqlService.Infrastructure.Extensions;
var builder = Host.CreateDefaultBuilder(args);
builder.ConfigureServices((context, services) =>
{
// Single registration for all SQL operations
services.AddSqlService(context.Configuration);
// Your other services...
});
var host = builder.Build();
await host.RunAsync();
📝 Usage Examples
1. Define Your Entity
using SqlService.Core.Attributes;
[Table("Users", Schema = "dbo")]
public class User
{
[PrimaryKey(IsIdentity = true)]
public int Id { get; set; }
[Column("UserName", MaxLength = 100)]
public string Name { get; set; } = string.Empty;
[Column("EmailAddress", MaxLength = 256)]
public string Email { get; set; } = string.Empty;
[Column("IsActive")]
public bool Active { get; set; } = true;
[Column("CreatedDate")]
public DateTime CreatedDate { get; set; } = DateTime.UtcNow;
[Ignore] // Not mapped to database
public string? TempData { get; set; }
}
2. Inject and Use the Service
using SqlService.Core.Interfaces;
public class UserService
{
private readonly ISqlService<User> _sqlService;
public UserService(ISqlService<User> sqlService)
{
_sqlService = sqlService;
}
// Get single user
public async Task<User?> GetUserAsync(int id)
{
return await _sqlService.GetByIdAsync(id);
}
// Get all users
public async Task<IEnumerable<User>> GetAllUsersAsync()
{
return await _sqlService.GetAllAsync();
}
// Get with WHERE clause
public async Task<IEnumerable<User>> GetActiveUsersAsync()
{
var parameters = new Dictionary<string, object?>
{
["Active"] = true
};
return await _sqlService.GetWhereAsync(
"Active = @Active",
parameters
);
}
// Pagination
public async Task<QueryResult<User>> GetUsersPagedAsync(int page, int pageSize)
{
return await _sqlService.GetPagedAsync(page, pageSize);
}
// Insert single user
public async Task<int> CreateUserAsync(User user)
{
return await _sqlService.InsertAsync(user);
}
// Update user
public async Task<int> UpdateUserAsync(User user)
{
return await _sqlService.UpdateAsync(user);
}
// Delete user
public async Task<int> DeleteUserAsync(int id)
{
return await _sqlService.DeleteAsync(id);
}
// Batch insert (high performance)
public async Task<int> CreateManyUsersAsync(List<User> users)
{
return await _sqlService.BatchInsertAsync(users, batchSize: 5000);
}
// Batch update
public async Task<int> UpdateManyUsersAsync(List<User> users)
{
return await _sqlService.BatchUpdateAsync(users, batchSize: 2000);
}
// Batch delete
public async Task<int> DeleteManyUsersAsync(List<int> ids)
{
var idsAsObjects = ids.Cast<object>().ToList();
return await _sqlService.BatchDeleteAsync(idsAsObjects, batchSize: 10000);
}
// Transaction support
public async Task TransferUsersAsync()
{
await using var transaction = await _sqlService.BeginTransactionAsync();
try
{
// Multiple operations in transaction
await _sqlService.InsertAsync(new User { Name = "User1", Email = "[email protected]" });
await _sqlService.InsertAsync(new User { Name = "User2", Email = "[email protected]" });
// Transaction commits automatically on dispose if no exception
}
catch
{
// Transaction rolls back automatically on exception
throw;
}
}
// Raw SQL query
public async Task<IEnumerable<User>> CustomQueryAsync()
{
var sql = "SELECT * FROM [dbo].[Users] WHERE CreatedDate > @Date";
var parameters = new Dictionary<string, object?>
{
["Date"] = DateTime.UtcNow.AddDays(-30)
};
return await _sqlService.ExecuteRawQueryAsync(sql, parameters);
}
// Scalar query
public async Task<int?> GetUserCountAsync()
{
var sql = "SELECT COUNT(*) FROM [dbo].[Users] WHERE Active = @Active";
var parameters = new Dictionary<string, object?>
{
["Active"] = true
};
return await _sqlService.ExecuteScalarAsync<int>(sql, parameters);
}
}
🏗️ Architecture
SqlService/
├── Core/ # Domain layer (no dependencies)
│ ├── Attributes/ # Entity mapping attributes
│ ├── Models/ # DTOs and configuration models
│ └── Interfaces/ # Service interfaces
│
├── Infrastructure/ # Implementation layer
│ ├── Factories/ # Connection and command factories
│ ├── Builders/ # SQL command builders (reflection-free)
│ ├── Mappers/ # Entity mappers (compiled expressions)
│ ├── Services/ # Service implementations
│ └── Extensions/ # DI registration extensions
│
└── SqlService.csproj # Optimized project file (AOT/Trimming)
🎯 AOT Compatibility
This library is fully compatible with Native AOT compilation:
# Publish with AOT
dotnet publish -c Release -r win-x64
# Verify trimming warnings
dotnet build -c Release
AOT'nin Temel Özellikleri
- Sıfır Yansıma: Tüm varlık eşleme işlemleri derlenmiş ifadeler kullanır.
- DynamicallyAccessedMembers: Kesici güvenliği için uygun açıklamalar
- Statik Meta Veriler: Derleme zamanı meta veri önbelleği
- Dinamik Kod Üretimi Yok: Tüm kod yolları statik olarak analiz edilebilir
📊 Derleme Yapılandırması
Proje, optimum AOT ve kırpma ayarlarıyla yapılandırılmıştır:
PublishAot: truePublishTrimmed: trueTrimMode: fullIlcOptimizationPreference: SpeedDebugType: none (Sürüm derlemeleri)
🛡️ Güvenlik
- SQL Enjeksiyon Koruması: Tüm sorgular parametreli komutlar kullanır
- Bağlantı Havuzu: Verimli bağlantı yönetimi
- Kayıtlarda Kişisel Bilgi Yok: Hassas veriler kayıt altına alınmaz
- Varsayılan Olarak Güvenli: En iyi uygulamalar uygulanır
📄 Lisans
MIT Lisansı - ticari projelerde kullanmaktan çekinmeyin.
🤝 Katkıda Bulunma
Katkılarınız memnuniyetle karşılanır! Lütfen şunlara dikkat edin:
- Kod AOT uyumludur (yansıma yoktur)
- Tüm testler başarıyla tamamlanmıştır
- Kırpma uyarıları giderilmiştir
- Performans ölçütleri hedeflere ulaşıyor
📞 Destek
Sorunlar, sorular veya özellik talepleri için lütfen GitHub'da bir sorun kaydı oluşturun.
Yüksek performanslı .NET uygulamaları için ❤️ ile geliştirildi
- C#,AOT,Trimming