Rod*_*her 4 dependency-injection asp.net-core asp.net-core-2.0
今天我尝试了新的asp.net核心2.0,但是在使用JSON配置文件时遇到了一些麻烦,我没有注入IConfiguration配置构造函数属性.
在asp.net核心1.1中,我将在StartUp中使用以下代码:
public static IConfigurationRoot Configuration;
Public Startup(IHostingEnvironment env) {
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appSettings.json", optional: false, reloadOnChange: true)
Configuration = builder.Build();
}
Run Code Online (Sandbox Code Playgroud)
并可以从代码访问它,如:
private string _mailTo = Startup.Configuration["mailSettings:mailToAddress"];
Run Code Online (Sandbox Code Playgroud)
然而在Core 2.0中他们改为IConfiguration并且它已经定义了,而且我没有看到任何方式我可以在我的其他类中使用该配置,所以我对如何继续进行有点无能为力.
startupClass:
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Configuration;
using Microsoft.AspNetCore.Mvc.Formatters;
using NLog.Web;
using NLog.Extensions.Logging;
using cityInfoTestApi.Services;
namespace cityInfoTestApi
{
public class Startup
{
public IConfiguration Configuration { get; private set; }
public Startup(IConfiguration configuration, IHostingEnvironment env)
{
Configuration = configuration;
env.ConfigureNLog("nlog.config");
}
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.AddMvcOptions(o => o.OutputFormatters.Add(new XmlDataContractSerializerOutputFormatter()));
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddNLog();
app.AddNLogWeb();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseStatusCodePages();
app.UseMvc();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的json文件:
{
"mailSetings": {
"mailToAddress": "admin@mycompany.com",
"mailFromAddress": "noreply@mycompany.com"
}
}
Run Code Online (Sandbox Code Playgroud)
我想要使用设置的自定义类(注意它是如何使用核心1.1:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
namespace cityInfoTestApi.Services
{
public class LocalMailService : IMailService
{
private string _mailTo = Startup.Configuration["mailSettings:mailToAddress"];
private string _mailFrom = Startup.Configuration["mailSettings:mailFromAddress"];
public void Send(string subject, string message)
{
Debug.WriteLine($"Mail from {_mailFrom} to {_mailTo}, with LocalMailService");
Debug.WriteLine($"Subject: {subject}");
Debug.WriteLine($"Message: {message}");
}
}
}
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激,干杯!
是的,ASP.NET Core 2.0改变了配置构建的方式.你IWebHostBuilder.ConfigureAppConfiguration现在需要使用方法.
IWebHost在Program.cs中为您的创建添加类似的内容:
.ConfigureAppConfiguration((builderContext, config) =>
{
IHostingEnvironment env = builderContext.HostingEnvironment;
config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
})
Run Code Online (Sandbox Code Playgroud)
然后IConfiguration可以Startup通过构造函数将实例作为依赖项(或任何其他类,由于DI机制)注入到您的类中:
public class Startup
{
public IConfiguration Configuration { get; }
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
...
}
Run Code Online (Sandbox Code Playgroud)
有一篇很好的文章描述了这些变化:ASP.NET Core 2.0配置更改
关于从自定义类(如LocalMailService)访问设置的方法- 避免使用任何静态依赖项.这个破坏的DI概念在ASP.NET Core中使用.请阅读有关使用IOptions功能的信息.或者您可以再次使用DI并IConfiguration通过ctor 获取实例LocalMailService.
| 归档时间: |
|
| 查看次数: |
6165 次 |
| 最近记录: |