【问题标题】:unable to inject dependency in .net core 3.1无法在 .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。这可以看作是代码异味。

标签: c# asp.net-core .net-core dependency-injection asp.net-core-webapi


【解决方案1】:

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

【讨论】:

  • 你确定吗? internal 是类的默认值,而不是构造函数或其他方法(默认情况下是私有的)。但是你是对的,internalpublic 旁边被接受(但必须明确设置)。我已将此信息添加到答案中。
  • @Tearth 没错,我的 ctor 没有标记为公开,也没有必要将 IConfiguration 添加为单例作为 .net 核心的默认行为来注入它
猜你喜欢
  • 1970-01-01
  • 2020-12-20
  • 2016-05-22
  • 1970-01-01
  • 2017-07-23
  • 2021-07-15
  • 2021-10-23
  • 1970-01-01
  • 2021-02-02
相关资源
最近更新 更多