Container IoC tích hợp quản lý vòng đời của kiểu dịch vụ đã đăng ký. Nó tự động hủy instance dịch vụ dựa trên vòng đời được chỉ định.
Container IoC tích hợp hỗ trợ ba loại vòng đời:
Singleton
Container IoC sẽ tạo và chia sẻ một instance duy nhất của dịch vụ trong suốt vòng đời ứng dụng.
Transient
Container IoC sẽ tạo instance mới của kiểu dịch vụ được chỉ định mỗi khi bạn yêu cầu nó.
Scoped
Container IoC sẽ tạo instance của kiểu dịch vụ được chỉ định một lần cho mỗi request và được chia sẻ trong một request đơn lẻ.
Ví dụ
public interface ILog {
void Info(string str);
}
class MyConsoleLogger : ILog {
public void Info(string str) {
Console.WriteLine(str);
}
}
public class Startup {
public void ConfigureServices(IServiceCollection services) {
// Singleton - sử dụng instance có sẵn
services.Add(new ServiceDescriptor(typeof(ILog), new MyConsoleLogger()));
// Transient - tạo mới mỗi lần yêu cầu
services.Add(new ServiceDescriptor(typeof(ILog), typeof(MyConsoleLogger), ServiceLifetime.Transient));
// Scoped - tạo mới mỗi request
services.Add(new ServiceDescriptor(typeof(ILog), typeof(MyConsoleLogger), ServiceLifetime.Scoped));
}
}
Ví dụ sau minh họa cách đăng ký kiểu (dịch vụ) sử dụng extension methods:
public class Startup {
public void ConfigureServices(IServiceCollection services) {
// Các cách đăng ký Singleton
services.AddSingleton<ILog, MyConsoleLogger>();
services.AddSingleton(typeof(ILog), typeof(MyConsoleLogger));
// Các cách đăng ký Transient
services.AddTransient<ILog, MyConsoleLogger>();
services.AddTransient(typeof(ILog), typeof(MyConsoleLogger));
// Các cách đăng ký Scoped
services.AddScoped<ILog, MyConsoleLogger>();
services.AddScoped(typeof(ILog), typeof(MyConsoleLogger));
}
}
Lưu ý quan trọng: Việc chọn vòng đời phù hợp ảnh hưởng trực tiếp đến hiệu suất, sử dụng bộ nhớ và hành vi của ứng dụng. Singleton phù hợp cho các dịch vụ không trạng thái (stateless), Transient cho các dịch vụ nhẹ, ngắn hạn, và Scoped cho các dịch vụ cần chia sẻ trạng thái trong một request HTTP.