ASP.NET Core: Dependency Injection ile AI Yönetimi

Kurumsal bir ASP.NET Core uygulamasında, AI API anahtarlarını ve istemci nesnelerini (Clients) doğrudan Controller içinde oluşturmak yerine, merkezi DI (Dependency Injection) konteynerine kaydetmek gerekir. Bu yaklaşım, HTTP bağlantılarını optimize eder ve birim testleri (unit test) kolaylaştırır.

1. Servis Kaydı (Program.cs)

OpenAI veya Gemini istemcileri thread-safe oldukları için genellikle Singleton olarak kaydedilirler.

// Program.cs
using OpenAI;

var builder = WebApplication.CreateBuilder(args);

// API Ayarlarını Al
var apiKey = builder.Configuration["OpenAI:ApiKey"];

// AI Servisini Kaydet
builder.Services.AddSingleton(new OpenAIClient(apiKey));

builder.Services.AddControllers();

2. Controller İçinde Kullanım (Injection)

Kaydedilen servisi constructor üzerinden talep ederek kullanın.

[ApiController]
[Route("api/[controller]")]
public class ChatController : ControllerBase
{
    private readonly OpenAIClient _aiClient;

    public ChatController(OpenAIClient aiClient)
    {
        _aiClient = aiClient;
    }

    [HttpPost("ask")]
    public async Task<IActionResult> AskAI([FromBody] string prompt)
    {
        var chatClient = _aiClient.GetChatClient("gpt-4o");
        var response = await chatClient.CompleteChatAsync(prompt);
        return Ok(response.Value.Content);
    }
}
Neden Singleton?

AI istemcileri içinde bir HttpClient barındırır. Singleton kullanımı, bu istemcinin uygulama boyunca bir kez oluşturulmasını sağlayarak "Socket Exhaustion" hatalarını önler ve performansı artırır.

3. Best Practice: IService Arayüzü Kullanımı

Daha esnek bir mimari için servisinizi bir arayüz (Interface) arkasına gizleyin:

public interface IAIService {
    Task<string> GetResponseAsync(string prompt);
}

// Program.cs içinde:
builder.Services.AddScoped<IAIService, OpenAIService>();