Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Cách chỉ định vòng đời dịch vụ cho dịch vụ đã đăng ký như một dependency trong C# ASP.NET Core

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.