首页 > 解决方案 > 无法使用我们自己的类解析类型的服务

问题描述

我们在调用 web api 控制器时遇到了这个异常:

InvalidOperationException:尝试激活“SDS.Lambda.Controllers.SapController”时无法解析“SDS.Lambda.Interfaces.ISecretManager”类型的服务。\r\n <p class="location">Microsoft.Extensions.DependencyInjection.ActivatorUtilities .GetService(IServiceProvider sp, Type type, Type requiredBy, bool isDefaultParameterRequired)

StartUp.cs包含以下内容:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<ISecretManager, SecretManager>();
}

控制器有这个构造函数:

public class SapController : Controller
{
    public SapController(ISecretManager secretManager)
    {
        _secretManager = secretManager;
    }
}

我们在将其他类型注入构造函数时遇到同样的问题,但可以注入 IConfiguration 实例,例如该参数不会导致异常:

public SapController(IConfiguration configuration, ISecretManager secretManager)

ISecretManager 界面看起来像这样(是的,确实如此):

namespace SDS.Lambda.Interfaces
{
    public interface ISecretManager
    {
    }
}

和课程(是的,真的 - 我减少了它以避免复杂性):

namespace SDS.Lambda.Interfaces
{
    public class SecretManager : ISecretManager
    {
    }
}

我们是否提供了错误的接口/具体类型?

有没有办法检索具体类型以测试它是否已正确提供?

当执行到底部时ConfigureServices,如果我们查看services实例结果枚举,在调试器视图中,我们正在注入的类型被列出,因此我们无法看到它们为什么无法实例化。

更新

在同一解决方案中详细说明和解释另一个类/依赖项的问题:

控制器:

namespace SDS.Lambda.Controllers
{
    [Route("api/[controller]")]
    public class SapController : Controller
    {
        readonly IHelper helper;

        public SapController(IHelper helpme)
        {
            helper = helpme;
        }
...
}

界面:

namespace SDS.Lambda.Interfaces
{
    public interface IHelper
    {
    }
}

班级:

namespace SDS.Lambda.Helpers
{
    public class Helper : IHelper
    {
        public Helper()
        {
        }
    }
}

启动:

namespace SDS.Lambda
{
    public class Startup
    {
        public static IConfiguration Configuration { get; private set; }
        private readonly AppSettings _appSettings;

        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
            _appSettings = configuration.GetSection("AppSettings").Get<AppSettings>();
        }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddLogging(logger => logger.AddLambdaLogger());
            
            services.AddSingleton<IHelper, Helper>();
            
            services.AddControllers();
        }
...
}

标签: asp.net-web-api.net-coreinversion-of-control

解决方案


推荐阅读