Web框架 --- 依赖注入的生命周期
什么是生命周期
- 通过依赖注入的实例都有一个生命周期, 主要有三种生命周期
Singleton
- 整个程序运行过程中, 只产生一个实例, 应用程序结束后会被销毁
- controller默认为singleton, 大部分情况下service和repository的实例也都为单例
当使用 Singleton 生命周期时,一个典型的例子是在一个应用程序中管理全局状态或共享资源,确保整个应用程序只有一个实例。
// 全局状态管理服务接口
public interface IGlobalStateService
{
int GetTotalUsers();
void IncrementUserCount();
}
// 具体的全局状态管理服务实现
public class GlobalStateService : IGlobalStateService
{
private int totalUsers;
public GlobalStateService()
{
totalUsers = 0;
}
public int GetTotalUsers()
{
return totalUsers;
}
public void IncrementUserCount()
{
totalUsers++;
}
}
// 在 Startup.cs 中进行注册
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IGlobalStateService, GlobalStateService>();
}
在这个示例中,GlobalStateService
被注册为 IGlobalStateService
接口的实现,并且使用 Singleton
生命周期。这意味着在整个应用程序生命周期内,只有一个 GlobalStateService
实例存在,即使多个组件或服务需要访问全局状态,它们都会共享同一个实例。
这种生命周期适用于那些需要在整个应用程序中共享状态或资源的服务,如全局配置、计数器、全局缓存等。
Scoped in C# or Request in Java
- 在同一次请求中只产生一个实例, 请求结束后实例会被销毁. 如果在不同的请求中,将会创建一个新的实例
当使用 ASP.NET Core 中的 Scoped
生命周期时,一个典型的例子是在 Web 应用程序中管理用户的登录状态。假设有一个用于管理用户身份验证和授权的服务,我们将其注册为 Scoped
生命周期,以便在每个 HTTP 请求期间维护相同的实例状态。
// 用户管理服务接口
public interface IUserManagementService
{
bool IsUserLoggedIn();
void Login(string username);
void Logout();
}
// 具体的用户管理服务实现
public class UserManagementService : IUserManagementService
{
private bool isLoggedIn;
private string loggedInUsername;
public UserManagementService()
{
isLoggedIn = false;
loggedInUsername = null;
}
public bool IsUserLoggedIn()
{
return isLoggedIn;
}
public void Login(string username)
{
isLogg