C# 服务注册与生命周期

服务未注册与生命周期的区别与冲突问题

服务未注册指依赖注入容器中未找到所需服务的类型映射,通常抛出InvalidOperationException。生命周期冲突指服务注册时生命周期配置不一致(如单例依赖瞬态服务),导致资源泄露或状态异常。

服务未注册的解决方法

检查服务是否在Startup.csProgram.cs中正确注册:

csharp 复制代码
// 正确注册示例
services.AddScoped<IMyService, MyService>();

使用TryAdd方法避免重复注册:

csharp 复制代码
services.TryAddScoped<IMyService, MyService>();

生命周期冲突的解决方法

避免单例服务依赖瞬态/作用域服务:

csharp 复制代码
// 错误示例(单例依赖瞬态)
services.AddSingleton<SingletonService>();
services.AddTransient<TransientService>(); // 被单例引用会导致问题

// 正确做法:统一生命周期
services.AddSingleton<SingletonService>();
services.AddSingleton<DependencyService>();

使用工厂模式延迟解析:

csharp 复制代码
services.AddSingleton<IService>(provider => 
    provider.GetRequiredService<IOtherService>().CreateService());

验证服务注册的代码示例

通过ServiceProvider手动验证:

csharp 复制代码
var serviceProvider = services.BuildServiceProvider();
using var scope = serviceProvider.CreateScope();
var service = scope.ServiceProvider.GetService<IMyService>();
if (service == null) throw new Exception("Service not registered");

生命周期冲突检测工具

启用依赖验证(开发环境):

csharp 复制代码
services.BuildServiceProvider(validateScopes: true);

ASP.NET Core默认在开发环境开启范围验证,可通过以下配置强化检测:

csharp 复制代码
services.BuildServiceProvider(new ServiceProviderOptions {
    ValidateScopes = true,
    ValidateOnBuild = true
});
相关推荐
AI人工智能+电脑小能手3 小时前
【大白话说Java面试题 第77题】【Mysql篇】第7题:回表查询与全表扫描的区别?
java·开发语言·数据库·mysql·面试
水木流年追梦3 小时前
大模型入门-大模型分布式训练2
开发语言·分布式·python·算法·正则表达式·prompt
口袋里のInit4 小时前
基础知识——ARM M核入栈出栈流程
开发语言·arm开发
罗超驿4 小时前
5.Java线程创建全攻略:5种写法 + 高频面试题解析
java·开发语言·java-ee
KeanuReeves4 小时前
【常用操作】BAT常用脚本命令整理
windows
Simon523144 小时前
反射------5.26学习小计
java·开发语言·spring boot
ComputerInBook4 小时前
C++ 23 相比 C++ 20 新增之特征
开发语言·算法·c++23
一知半解仙4 小时前
Claude Code的跨平台安装教程
java·开发语言·人工智能·开源
代钦塔拉4 小时前
C++ auto
开发语言·c++