如何在ASP.NET CORE API中注册存在构造函数依赖的服务
ASP.NET Core 构造函数依赖注册方法
你可以直接手动实例化依赖类传入构造函数完成注册,这是合法的写法,针对你当前给出的代码,修改后可以直接运行:
public void ConfigureServices(IServiceCollection services) { services.AddControllers(); services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "TestAPI", Version = "v2" }); }); // 先实例化依赖项 var adminRepository = new AdminRepository(); services.AddSingleton<IAdminRepository>(adminRepository); // 将已实例化的依赖传入目标服务构造函数 services.AddSingleton<IAdminService>(new AdminService(adminRepository)); }
但日常开发更推荐直接使用DI容器的自动依赖解析能力,不需要手动实例化服务,你只需要按接口和实现类的对应关系完成注册,容器会自动识别服务构造函数要求的依赖,从已注册的服务列表中找到对应实例完成注入,写法更简洁,后续服务新增依赖时也不需要修改注册代码:
public void ConfigureServices(IServiceCollection services) { services.AddControllers(); services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "TestAPI", Version = "v2" }); }); // 直接注册服务映射关系,无需手动new services.AddSingleton<IAdminRepository, AdminRepository>(); services.AddSingleton<IAdminService, AdminService>(); }
两种注册方式的适用场景区别:
- 手动传入实例:由开发人员自己负责服务对象的创建,容器仅负责保存你传入的实例,不处理后续的依赖链解析和生命周期销毁逻辑,适合无额外依赖的简单服务、或者需要传入自定义预配置实例的场景。如果后续服务新增构造函数依赖,必须手动修改实例化代码补全参数,否则会抛出运行时错误。
- 泛型自动注册:由DI容器负责管理完整的依赖链解析、服务实例创建与生命周期释放,不管服务嵌套了多少层依赖,只要对应依赖都完成了注册,容器就能自动完成注入,是常规业务开发的首选写法。
内容的提问来源于stack exchange,提问作者jo1
相关产品推荐
相关产品推荐

