Jam*_*317 20 asp.net-mvc dependency-injection asp.net-core
我试图将一个接口注入我的HomeController,我收到此错误:
InvalidOperationException:尝试激活时无法解析类型"Microsoft.Extensions.Configuration.IConfiguration"的服务
我的Startup类如下:
public Startup(IApplicationEnvironment appEnv)
{
var builder = new ConfigurationBuilder()
.SetBasePath(appEnv.ApplicationBasePath)
.AddEnvironmentVariables()
.AddJsonFile("appsettings.json");
Configuration = builder.Build();
}
public IConfigurationRoot Configuration { get; set; }
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddApplicationInsightsTelemetry(Configuration);
services.AddEntityFramework()
.AddSqlServer()
.AddDbContext<ApplicationDbContext>(options => options
.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]));
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.AddMvc();
services.AddSingleton(provider => Configuration);
// Add application services.
services.AddTransient<IEmailSender, AuthMessageSender>();
services.AddTransient<ISmsSender, AuthMessageSender>();
}
public void Configure(
IApplicationBuilder app,
IHostingEnvironment env,
ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
app.UseApplicationInsightsRequestTelemetry();
if (env.IsDevelopment())
{
app.UseBrowserLink();
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
try
{
using (var serviceScope = app.ApplicationServices
.GetRequiredService<IServiceScopeFactory>()
.CreateScope())
{
serviceScope.ServiceProvider
.GetService<ApplicationDbContext>()
.Database.Migrate();
}
}
catch { }
}
app.UseIISPlatformHandler(options => options.AuthenticationDescriptions.Clear());
app.UseApplicationInsightsExceptionTelemetry();
app.UseStaticFiles();
app.UseIdentity();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
app.Run((async (context) =>
{
await context.Response.WriteAsync("Error");
}));
}
Run Code Online (Sandbox Code Playgroud)
我的HomeController构造函数是:
public HomeController(IConfiguration configuration, IEmailSender mailService)
{
_mailService = mailService;
_to = configuration["emailAddress.Support"];
}
Run Code Online (Sandbox Code Playgroud)
请告诉我哪里弄错了.
Microsoft.Extensions.DependencyInjection.ServiceLookup.Service.PopulateCallSites(ServiceProvider提供程序,ISet`1 callSiteChain,ParameterInfo []参数,Boolean throwIfCallSiteNotFound)
Wil*_*Ray 33
尝试将其注入IConfigurationRoot而不是IConfiguration:
public HomeController(IConfigurationRoot configuration
, IEmailSender mailService)
{
_mailService = mailService;
_to = configuration["emailAddress.Support"];
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,行
services.AddSingleton(provider => Configuration);
Run Code Online (Sandbox Code Playgroud)
相当于
services.AddSingleton<IConfigurationRoot>(provider => Configuration);
Run Code Online (Sandbox Code Playgroud)
因为Configuration类的属性是这样声明的,并且注入将通过匹配它注册的任何类型来完成.我们可以很容易地复制它,这可能会更清楚:
public interface IParent { }
public interface IChild : IParent { }
public class ConfigurationTester : IChild { }
Run Code Online (Sandbox Code Playgroud)
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddMvc();
IChild example = new ConfigurationTester();
services.AddSingleton(provider => example);
}
Run Code Online (Sandbox Code Playgroud)
public class HomeController : Controller
{
public HomeController(IParent configuration)
{
// this will blow up
}
}
Run Code Online (Sandbox Code Playgroud)
正如评论中提到的stephen.vakil一样,最好将配置文件加载到类中,然后根据需要将该类注入控制器.这看起来像这样:
services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));
Run Code Online (Sandbox Code Playgroud)
您可以使用IOptions界面获取这些配置:
public HomeController(IOptions<AppSettings> appSettings)
Run Code Online (Sandbox Code Playgroud)
在Core 2.0中,建议使用IConfiguration而不是IConfigurationRoot
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
Run Code Online (Sandbox Code Playgroud)
来自https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/#add-configuration-providers
| 归档时间: |
|
| 查看次数: |
25094 次 |
| 最近记录: |