FromServices与WebApplicationFactory<Program>配合使用失效问题
问题原因分析
核心原因:属性注入的触发场景有限制
ASP.NET Core的[FromServices]属性注入只在特定场景下会自动生效,直接通过ServiceProvider.GetRequiredService<T>()获取服务实例时,不会自动触发属性注入。
具体区别:
- 主应用里,当服务是通过ASP.NET Core请求管道创建的(比如控制器、页面模型,或者被这些组件依赖的服务),框架会自动处理
[FromServices]的属性注入——因为请求管道内部会用到依赖注入容器的属性注入激活逻辑。 - 但测试里,你直接用
scope.ServiceProvider.GetRequiredService<CompanyServices>()获取实例时,默认的服务提供器激活逻辑只处理构造函数注入,不会主动扫描并注入标记了[FromServices]的属性。
构造函数注入为啥正常?
构造函数注入是.NET依赖注入的核心激活方式,不管是主应用还是直接从ServiceProvider拿实例,容器都会自动解析并注入构造函数需要的依赖,这是默认行为。
可选解决思路
如果非要在测试里让[FromServices]生效,有两种方式:
- 改用构造函数注入:这是最推荐的,构造函数注入更显式,容易测试和维护,也是.NET依赖注入的最佳实践。
- 手动触发属性注入:如果必须保留属性注入,可以在拿到实例后,手动用
ActivatorUtilities完成注入:var companyServices = scopedServices.GetRequiredService<CompanyServices>(); // 手动触发属性注入 ActivatorUtilities.CreateInstance(scopedServices, companyServices.GetType()); // 此时companyServices的AutoQuery和Ef属性应该已被注入
不过这种方式不推荐,会增加测试复杂度,还偏离最佳实践。
内容的提问来源于stack exchange,提问作者Guerrilla
相关产品推荐
相关产品推荐

