首页 > 解决方案 > 无法解析 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() 方法解决可选依赖项。

任何帮助深表感谢

标签: c#dependency-injectionautofac

解决方案


那是因为您正在请求 XService,但是您将 XService 注册为 IXService 接口。

您必须将其更改为

    public class XServiceTest : TestKernel
    {
        private readonly IXService _service;

        public XServiceTest()
        {
            _service = Get<IXService>();
        }
    }

将具体类注册到容器中是完全有效的。例如,您可以这样做:

    builder.RegisterType<XService>().As<XService>();

这样一来,您就可以从容器中请求 XService 并且它会按照所写的那样工作。这通常不是您想要做的,但在某些情况下可能是有益的。


推荐阅读