×

Triển Khai Dependency Injection Trong C# và .NET Core

Dependency Injection (DI) là một kỹ thuật quan trọng trong lập trình giúp quản lý sự phụ thuộc giữa các đối tượng, làm cho mã nguồn dễ bảo trì và kiểm thử hơn. Trong C#, DI có thể được triển khai thông qua nhiều cách khác nhau, bao gồm sử dụng thư viện mặc định của .NET Core hoặc các thư viện DI khác như Autofac hoặc Ninject. Bài viết này sẽ tập trung vào việc triển khai DI bằng cách sử dụng thư viện DI mặc định của .NET Core.

Các Bước Triển Khai Dependency Injection

1. Tạo Dự Án .NET Core

Đầu tiên, tạo một dự án .NET Core mới. Ví dụ, bạn có thể tạo một ứng dụng console hoặc một ứng dụng ASP.NET Core.

dotnet new console -n DependencyInjectionDemo
cd DependencyInjectionDemo

2. Định Nghĩa Các Interface và Class

Tạo các interface và class mà bạn sẽ sử dụng trong dự án. Ví dụ, tạo một interface IMessageService và một class EmailMessageService triển khai interface này.

// IMessageService.cs
public interface IMessageService
{
    void SendMessage(string message);
}

// EmailMessageService.cs
public class EmailMessageService : IMessageService
{
    public void SendMessage(string message)
    {
        Console.WriteLine($"Email sent: {message}");
    }
}

3. Cấu Hình DI Container

Trong .NET Core, bạn có thể cấu hình DI container trong phương thức Main của chương trình.

// Program.cs
using Microsoft.Extensions.DependencyInjection;
using System;

public class Program
{
    public static void Main(string[] args)
    {
        // 1. Tạo một service collection
        var serviceCollection = new ServiceCollection();
        
        // 2. Đăng ký các dịch vụ
        ConfigureServices(serviceCollection);
        
        // 3. Xây dựng service provider
        var serviceProvider = serviceCollection.BuildServiceProvider();
        
        // 4. Sử dụng các dịch vụ
        var messageService = serviceProvider.GetService<IMessageService>();
        messageService.SendMessage("Hello, Dependency Injection!");
    }

    private static void ConfigureServices(IServiceCollection services)
    {
        // Đăng ký IMessageService với EmailMessageService
        services.AddTransient<IMessageService, EmailMessageService>();
    }
}

4. Chạy Ứng Dụng

Chạy ứng dụng của bạn để kiểm tra xem DI có hoạt động đúng không.

dotnet run

Bạn sẽ thấy kết quả đầu ra như sau:

Email sent: Hello, Dependency Injection!

Cấu Hình Sử Dụng Các Phạm Vi (Lifetime)

Trong DI, có ba loại phạm vi (lifetime) mà bạn có thể cấu hình cho các dịch vụ của mình:

  • Transient: Tạo một instance mới mỗi khi nó được yêu cầu.
  • Scoped: Tạo một instance cho mỗi phạm vi (scope). Phạm vi thường được liên kết với một yêu cầu HTTP trong ứng dụng web.
  • Singleton: Tạo một instance duy nhất cho toàn bộ vòng đời của ứng dụng.
private static void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<IMessageService, EmailMessageService>(); // Transient
    services.AddScoped<IMessageService, EmailMessageService>(); // Scoped
    services.AddSingleton<IMessageService, EmailMessageService>(); // Singleton
}

Sử Dụng DI Trong ASP.NET Core

Nếu bạn đang làm việc với một ứng dụng ASP.NET Core, bạn sẽ cấu hình DI trong phương thức ConfigureServices của Startup.cs.

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddTransient<IMessageService, EmailMessageService>();
        services.AddControllers();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseRouting();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }
}

Và sử dụng DI trong các controller:

public class HomeController : ControllerBase
{
    private readonly IMessageService _messageService;

    public HomeController(IMessageService messageService)
    {
        _messageService = messageService;
    }

    [HttpGet]
    public IActionResult Index()
    {
        _messageService.SendMessage("Hello from HomeController");
        return Ok();
    }
}

Tổng Kết

Triển khai Dependency Injection trong C# giúp tăng tính module hóa, dễ dàng kiểm thử và bảo trì mã nguồn. Bằng cách sử dụng thư viện DI mặc định của .NET Core, bạn có thể dễ dàng quản lý các phụ thuộc của mình một cách hiệu quả.

Comments