XUnit集成测试中Autofac无法解析已注册服务类型如何解决
问题根因
Autofac的RegisterType<T>.As<TInterface>语法默认只会把服务注册为指定的接口类型,不会同时注册为自身的实现类类型。你在ApplicationServicesContainer里仅注册了XService对应IXService,因此容器中只有IXService的服务记录,没有XService本身的服务记录,直接解析XService就会抛出未注册异常。
解决方案
- 方案1:测试类直接解析注册的接口类型
修改测试类的解析逻辑,直接获取IXService即可,这也是依赖注入的标准最佳实践,依赖抽象而非具体实现:
public class XServiceTest : TestKernel { private readonly IXService _service; public XServiceTest() { _service = Get<IXService>(); } }
- 方案2:修改注册逻辑,同时注册实现类自身
如果确实需要直接解析实现类(例如要调用实现类中没有定义在接口里的方法),可以在注册时追加AsSelf()方法:
builder.RegisterType<XService>().As<IXService>().AsSelf();
修改后容器中会同时存在IXService和XService两个服务的注册记录,两种类型都可以正常解析。
可选调试手段
后续遇到同类注册问题时,可以在TestKernel构造函数的容器构建完成后,调用container.IsRegistered<目标类型>()快速判断指定类型是否注册成功,也可以遍历容器的注册记录排查异常。
内容的提问来源于stack exchange,提问作者AverageProgrammer
相关产品推荐
相关产品推荐

