无法在 .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
是类的默认值,而不是构造函数或其他方法(默认情况下是私有的)。但是你是对的,internal
在public
旁边被接受(但必须明确设置)。我已将此信息添加到答案中。
@Tearth 没错,我的 ctor 没有标记为公开,也没有必要将 IConfiguration 添加为单例作为 .net 核心的默认行为来注入它以上是关于无法在 .net core 3.1 中注入依赖项的主要内容,如果未能解决你的问题,请参考以下文章
.NET Core 3.1 中的依赖注入具有多种实现 [重复]
无法使用 MassTransit 在 Windows 服务应用程序 (.Net Core 3.1) 中向消费者注入服务