c# - 无法解析 Autofac 中的注册类型
问题描述
我正在尝试为使用 Autofac 实现依赖注入的项目(XUnit)编写集成测试。具体来说,我正在尝试测试我的服务层。
这就是为什么我实现了一个“内核”类,它注册了所有组件并具有一个返回参数中请求的组件的方法。
public class TestKernel
{
private readonly IContainer container;
public TestKernel()
{
var builder = new ContainerBuilder();
builder.RegisterModule(new ApplicationServicesContainer());
builder.RegisterModule(new SsspDomainContainer());
container = builder.Build();
}
public T Get<T>() where T : class
{
return container.Resolve<T>();
}
}
注册服务的模块:
public class ApplicationServicesContainer : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType<XService>().As<IXService>();
.
.
.
}
}
然后在测试中我获取服务:
public class XServiceTest : TestKernel
{
private readonly XService _service;
public XServiceTest()
{
_service = Get<XService>();
}
在测试执行时,我收到以下错误:
Autofac.Core.Registration.ComponentNotRegisteredException :请求的服务“Project.ApplicationServices.Services.XService”尚未注册。要避免此异常,请注册一个组件以提供服务,使用 IsRegistered() 检查服务注册,或使用 ResolveOptional() 方法解决可选依赖项。
任何帮助深表感谢
解决方案
那是因为您正在请求 XService,但是您将 XService 注册为 IXService 接口。
您必须将其更改为
public class XServiceTest : TestKernel
{
private readonly IXService _service;
public XServiceTest()
{
_service = Get<IXService>();
}
}
将具体类注册到容器中是完全有效的。例如,您可以这样做:
builder.RegisterType<XService>().As<XService>();
这样一来,您就可以从容器中请求 XService 并且它会按照所写的那样工作。这通常不是您想要做的,但在某些情况下可能是有益的。
推荐阅读
- parallel-processing - 是否可以结合人造丝和更快?
- javascript - 如何使用 Aws sdk angular 2 调用 api?
- javascript - 居中输入字段 - 问题
- ios - setHidesBackButton 不起作用
- sharepoint-2013 - Sharepoint 2013 PickerTreeView 更改字体颜色
- javascript - jQuery AJAX POST 对 PHP 的请求必须提交两次才能工作
- javascript - JavaScript 原型:冲突的结果
- sql-server - 计算日期差异,比较行并创建新的一次
- c# - Bot Framework Directline 发送通知 C#
- android - Parcelize 在对象和枚举上抱怨“Parcelable 应该是一个类”