Yasin Akmaz.

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: true
  • PublishTrimmed: true
  • TrimMode: full
  • IlcOptimizationPreference: Speed
  • DebugType: 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:

  1. Kod AOT uyumludur (yansıma yoktur)
  2. Tüm testler başarıyla tamamlanmıştır
  3. Kırpma uyarıları giderilmiştir
  4. 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

Gizlilik tercihlerinizi kontrol edin

Sitenin çalışması için gerekli çerezleri kullanıyoruz. İzniniz olursa site kullanımını anlamamıza yardımcı olan analitik çerezleri de kullanabiliriz.