无法在 .net core 3.1 中注入依赖项

Posted

技术标签:

【中文标题】无法在 .net core 3.1 中注入依赖项【英文标题】:unable to inject dependency in .net core 3.1 【发布时间】:2020-06-04 20:37:08 【问题描述】:

您好,我正在关注微软文档...

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-3.1#json-configuration-provider

为了在 .NET Core Web API 中将配置作为单例注入

这是我加载配置的 Program.cs 代码:

public class Program

    public static Dictionary<string, string> arrayDict =
   new Dictionary<string, string>
   
        "connString", "Data Source =xxx/xxx;User Id =xxx;Password =xxx"
   ;
    public static void Main(string[] args)
    
        CreateHostBuilder(args).Build().Run();
    

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration(builder =>
        
            builder.AddInMemoryCollection(arrayDict);
            builder.AddJsonFile(
                "appsettings.json", optional: false, reloadOnChange: false);
        )
        .ConfigureWebHostDefaults(webBuilder =>
        
            webBuilder.UseStartup<Startup>();
        );

Startup.cs 中我使用以下功能

public class Startup

    private readonly IConfiguration Configuration;

    public Startup(IConfiguration config)
    
        Configuration = config;
    


    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    
        services.AddControllers();
        services.AddSingleton<IConfiguration>(Configuration);
    

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    
        if (env.IsDevelopment())
        
            app.UseDeveloperExceptionPage();
        

        app.UseHttpsRedirection();

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        
            endpoints.MapControllers();
        );
    

当我在控制器中使用依赖注入时,我无法注入 IConfiguration,并在调用控制器操作时出现以下错误(运行时错误):

找不到适合“IrisDotNetCore.Controllers.LoginController”类型的构造函数。确保类型是具体的,并且为公共构造函数的所有参数注册了服务。

LoginController.cs 代码:

[Route("api/[controller]")]
[ApiController]
public class LoginController : ControllerBase

    IConfiguration _configuration;


    LoginController(IConfiguration configuration)
    
        _configuration = configuration;
    

这里可能有什么问题?

【问题讨论】:

这可能是XY problem。你为什么要尝试注入IConfiguration。这可以看作是代码异味。 【参考方案1】:

您的构造函数必须是公共的或内部的 - 请记住,在您的情况下,无法创建 LoginController 的实例(因为 LoginController 方法是私有的)。甚至错误消息(确保类型是具体的,并且为 public 构造函数的所有参数注册了服务)也表明了这一点。

【讨论】:

你确定吗? internal 是类的默认值,而不是构造函数或其他方法(默认情况下是私有的)。但是你是对的,internalpublic 旁边被接受(但必须明确设置)。我已将此信息添加到答案中。 @Tearth 没错,我的 ctor 没有标记为公开,也没有必要将 IConfiguration 添加为单例作为 .net 核心的默认行为来注入它

以上是关于无法在 .net core 3.1 中注入依赖项的主要内容,如果未能解决你的问题,请参考以下文章

WPF .Net Core 3.1 依赖注入/服务参考问题

.NET Core 3.1 中的依赖注入具有多种实现 [重复]

无法使用 MassTransit 在 Windows 服务应用程序 (.Net Core 3.1) 中向消费者注入服务

我的 ASP.NET Core MVVM Blazor 应用程序的依赖注入无法正常工作

.NET Core 3 Worker 服务设置依赖注入

ASP.NET Core 2 中的依赖注入引发异常