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