LP1*_*P13 102 c# asp.net-core-mvc asp.net-core
我已经完成了ASP.NET核心的配置文档.文档说您可以从应用程序的任何位置访问配置.
下面是模板创建的Startup.cs
public class Startup
{
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
if (env.IsEnvironment("Development"))
{
// This will push telemetry data through Application Insights pipeline faster, allowing you to view results immediately.
builder.AddApplicationInsightsSettings(developerMode: true);
}
builder.AddEnvironmentVariables();
Configuration = builder.Build();
}
public IConfigurationRoot Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddApplicationInsightsTelemetry(Configuration);
services.AddMvc();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
app.UseApplicationInsightsRequestTelemetry();
app.UseApplicationInsightsExceptionTelemetry();
app.UseMvc();
}
}
Run Code Online (Sandbox Code Playgroud)
因此,在Startup.cs配置所有设置时,Startup.cs还有一个名为的属性Configuration
我无法理解您如何在控制器或应用程序中的任何位置访问此配置?MS建议使用选项模式,但我只有4-5个键值对,所以我不想使用选项模式.我只想访问应用程序中的Configuration.如何在任何课程中注入它?
Hen*_*ema 129
使用ASP.NET Core 2.0将自动IConfiguration在依赖项注入容器中添加应用程序实例.这也适用于连同ConfigureAppConfiguration上WebHostBuilder.
例如:
public static void Main(string[] args)
{
var host = WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration(builder =>
{
builder.AddIniFile("foo.ini");
})
.UseStartup<Startup>()
.Build();
host.Run();
}
Run Code Online (Sandbox Code Playgroud)
这与将IConfiguration实例作为单个对象添加到服务集合一样简单ConfigureServices:
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IConfiguration>(Configuration);
// ...
}
Run Code Online (Sandbox Code Playgroud)
Configuration你Startup班上的实例在哪里?
这允许您注入IConfiguration任何控制器或服务:
public class HomeController
{
public HomeController(IConfiguration configuration)
{
// Use IConfiguration instance
}
}
Run Code Online (Sandbox Code Playgroud)
kon*_*nzo 24
configuration在startup.cs中还有一个选项可以使静态变量,以便您可以轻松地在任何地方访问它,静态变量很方便哈!
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
internal static IConfiguration Configuration { get; private set; }
Run Code Online (Sandbox Code Playgroud)
这使得配置可以在任何地方使用Startup.Configuration.GetSection...What can go wrong?
Sco*_*ttC 22
我知道这是旧的,但考虑到IOptions模式实现起来相对简单:
具有与配置中的设置匹配的公共get/set属性的类
public class ApplicationSettings
{
public string UrlBasePath { get; set; }
}
Run Code Online (Sandbox Code Playgroud)注册您的设置
public void ConfigureServices(IServiceCollection services)
{
...
services.Configure<ApplicationSettings>(Configuration.GetSection("ApplicationSettings"));
...
}
Run Code Online (Sandbox Code Playgroud)通过IOptions注入
public class HomeController
{
public HomeController(IOptions<ApplicationSettings> appSettings)
{ ...
appSettings.Value.UrlBasePath
...
// or better practice create a readonly private reference
}
}
Run Code Online (Sandbox Code Playgroud)我不确定你为什么不这样做.
May*_*zer 17
正确的方法:
在.NET Core中,您可以将IConfigurationas作为参数注入到Class构造函数中,并且它将可用。
public class MyClass
{
private IConfiguration configuration;
public MyClass(IConfiguration configuration)
{
ConnectionString = new configuration.GetValue<string>("ConnectionString");
}
Run Code Online (Sandbox Code Playgroud)
现在,当您要创建类的实例时,由于您的类正在注入IConfiguration,您将无法执行操作new MyClass(),因为您需要将IConfiguration参数传递给构造函数,因此,您需要注入您的注入链的类,这意味着两个简单的步骤:
1)将您的Classes添加IConfiguration到IServiceCollection中的ConfigureServices()方法中Startup.cs
services.AddTransient<MyClass>();
Run Code Online (Sandbox Code Playgroud)
2)定义一个实例-假设在中Controller,然后使用构造函数将其注入:
public class MyController : ControllerBase
{
private MyClass _myClass;
public MyController(MyClass myClass)
{
_myClass = myClass;
}
Run Code Online (Sandbox Code Playgroud)
现在您应该可以_myClass.configuration自由地享受自己的生活了...
另外一个选项:
如果您仍在寻找一种无需将类注入控制器即可使用的方法,则可以将其存储在中static class,将在中进行配置Startup.cs,例如:
public static class MyAppData
{
public static IConfiguration Configuration;
}
Run Code Online (Sandbox Code Playgroud)
您的Startup构造函数应如下所示:
public Startup(IConfiguration configuration)
{
Configuration = configuration;
MyAppData.Configuration = configuration;
}
Run Code Online (Sandbox Code Playgroud)
然后MyAppData.Configuration在程序的任何地方使用。
不要面对我,为什么第一个选择是正确的方法,我可以看到有经验的开发人员始终避免使用垃圾数据,并且众所周知,始终将大量数据存储在内存中不是最佳实践,它既不对性能和开发都没有好处,也可能只有您需要的东西才更安全。
小智 10
我知道可能有多种方法可以做到这一点,我正在使用 Core 3.1,并正在寻找最佳/更清洁的选项,我最终这样做了:
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
}
Run Code Online (Sandbox Code Playgroud)
{
"CompanySettings": {
"name": "Fake Co"
}
}
Run Code Online (Sandbox Code Playgroud)
using Microsoft.Extensions.Configuration;
public class EmployeeController
{
private IConfiguration _configuration;
public EmployeeController(IConfiguration configuration)
{
_configuration = configuration;
}
}
Run Code Online (Sandbox Code Playgroud)
public async Task<IActionResult> Post([FromBody] EmployeeModel form)
{
var companyName = configuration.GetValue<string>("CompanySettings:name");
// companyName = "Fake Co"
}
Run Code Online (Sandbox Code Playgroud)
我现在是这样做的:
// Requires NuGet package Microsoft.Extensions.Configuration.Json
using Microsoft.Extensions.Configuration;
using System.IO;
namespace ImagesToMssql.AppsettingsJson
{
public static class AppSettingsJson
{
public static IConfigurationRoot GetAppSettings()
{
string applicationExeDirectory = ApplicationExeDirectory();
var builder = new ConfigurationBuilder()
.SetBasePath(applicationExeDirectory)
.AddJsonFile("appsettings.json");
return builder.Build();
}
private static string ApplicationExeDirectory()
{
var location = System.Reflection.Assembly.GetExecutingAssembly().Location;
var appRoot = Path.GetDirectoryName(location);
return appRoot;
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后我在需要从 appsettings.json 文件中获取数据的地方使用它:
var appSettingsJson = AppSettingsJson.GetAppSettings();
// appSettingsJson["keyName"]
Run Code Online (Sandbox Code Playgroud)
我查看了选项模式示例并看到了这一点:
public class Startup
{
public Startup(IConfiguration config)
{
// Configuration from appsettings.json has already been loaded by
// CreateDefaultBuilder on WebHost in Program.cs. Use DI to load
// the configuration into the Configuration property.
Configuration = config;
}
...
}
Run Code Online (Sandbox Code Playgroud)
当在我的类的构造函数中添加 Iconfiguration 时,我可以通过 DI 访问配置选项。
例子:
public class MyClass{
private Iconfiguration _config;
public MyClass(Iconfiguration config){
_config = config;
}
... // access _config["myAppSetting"] anywhere in this class
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
75055 次 |
| 最近记录: |