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();
}
}
따라서 Startup.cs
에서 모든 설정을 구성하고 Startup.cs에는 Configuration
이라는 속성이 있습니다.
컨트롤러 또는이 응용 프로그램의 어느 위치에서나이 구성에 어떻게 액세스합니까? MS는 옵션 패턴 을 사용하도록 권장하지만 옵션 패턴을 사용하지 않으려 고하므로 4-5 개의 키 - 값 쌍만 있습니다. 방금 응용 프로그램의 구성에 액세스하고 싶었습니다. 어떤 수업에도 어떻게 주입합니까?
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();
}
IConfiguration
인스턴스를 서비스 콜렉션에 ConfigureServices
의 싱글 톤 객체로 추가하는 것만 큼 쉽습니다.
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IConfiguration>(Configuration);
// ...
}
Configuration
은 Startup
클래스의 인스턴스입니다.
이렇게하면 컨트롤러 또는 서비스에 IConfiguration
을 삽입 할 수 있습니다.
public class HomeController
{
public HomeController(IConfiguration configuration)
{
// Use IConfiguration instance
}
}
나는 이것이 오래되었음을 알고 있지만 IOptions 패턴을 구현하는 것이 상대적으로 간단하다.
구성의 설정과 일치하는 공개 get/set 속성이있는 클래스
public class ApplicationSettings
{
public string UrlBasePath { get; set; }
}
설정 등록
public void ConfigureServices(IServiceCollection services)
{
...
services.Configure<ApplicationSettings>(Configuration.GetSection("ApplicationSettings"));
...
}
iOptions를 통해 주입
public class HomeController
{
public HomeController(IOptions<ApplicationSettings> appSettings)
{ ...
appSettings.Value.UrlBasePath
...
// or better practice create a readonly private reference
}
}
나는 왜 당신이 이것을하지 않을지 확신하지 못합니다.
올바른 방법 :
.NET 코어에서 IConfiguration
을 클래스 생성자에 매개 변수로 삽입하면 사용할 수 있습니다.
public class MyClass
{
private IConfiguration configuration;
public MyClass(IConfiguration configuration)
{
ConnectionString = new configuration.GetValue<string>("ConnectionString");
}
이제는 클래스의 인스턴스를 만들려고 할 때 클래스가 IConfiguration
을 삽입하기 때문에 IConfiguration
매개 변수를 생성자에 전달해야하므로 new MyClass()
을 수행 할 수 없습니다. 클래스를 주입 사슬에 주입하는 것은 두 가지 간단한 단계를 의미합니다.
1) 클래스/es - IConfiguration
을 사용하려는 위치를 Startup.cs
의 ConfigureServices()
메소드에서 IServiceCollection
에 추가하십시오
services.AddTransient<MyClass>();
2) 인스턴스를 정의하십시오 - Controller
에서 말하고 생성자를 사용하여 삽입하십시오 :
public class MyController : ControllerBase
{
private MyClass _myClass;
public MyController(MyClass myClass)
{
_myClass = myClass;
}
이제 자유롭게 _myClass.configuration
을 (를) 즐길 수 있습니다.
다른 옵션 :
컨트롤러에 클래스를 삽입 할 필요없이 사용할 수있는 방법을 찾고 있다면 static class
에 저장할 수 있습니다. 다음과 같이 Startup.cs
에서 구성합니다.
public static class MyAppData
{
public static IConfiguration Configuration;
}
Startup
생성자는 다음과 같아야합니다.
public Startup(IConfiguration configuration)
{
Configuration = configuration;
MyAppData.Configuration = configuration;
}
그런 다음 프로그램에서 MyAppData.Configuration
를 사용하십시오.
첫 번째 옵션이 올바른 방법 인 이유와 마주 치지 마십시오. 숙련 된 개발자가 항상 길을 따라 쓰레기 데이터를 피하는 것을 볼 수 있습니다.로드가있는 것이 최선의 방법은 아니라는 것을 잘 알고 있습니다. 항상 메모리에있는 데이터를 사용할 수 있으며, 성능이나 개발에 적합하지 않으며, 필요할 때만 더 안전 할 수도 있습니다.
나는 옵션 패턴 샘플을 조사해 보았다 :
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;
}
...
}
내 클래스의 생성자에 Iconfiguration을 추가 할 때 DI를 통해 구성 옵션에 액세스 할 수있었습니다.
예:
public class MyClass{
private Iconfiguration _config;
public MyClass(Iconfiguration config){
_config = config;
}
... // access _config["myAppSetting"] anywhere in this class
}
나는 지금 이렇게하고있다.
// 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;
}
}
}
그리고 나서 appsettings.json 파일에서 데이터를 가져와야 할 곳에 사용합니다 :
var appSettingsJson = AppSettingsJson.GetAppSettings();
// appSettingsJson["keyName"]
또한 configuration
을 startup.cs에서 정적으로 만드는 옵션을 사용하면 어디서나 쉽게 액세스 할 수 있으며 정적 변수는 편리합니다!
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
internal static IConfiguration Configuration { get; private set; }
이렇게하면 Startup.Configuration.GetSection...
를 사용하여 어디서나 구성에 액세스 할 수 있습니다. 무엇이 잘못 될 수 있습니까?
8-2017 년에 Microsoft는 .NET CORE v4.4 용 System.Configuration
을 출시했습니다. 현재 v4.5 및 v4.6 미리보기.
.Net Framework에서 CORE 로의 변환 작업을하는 우리에게는 이것이 필수적입니다. 모든 어셈블리에서 액세스 할 수있는 현재 app.config
파일을 유지하고 사용할 수 있습니다. 마이크로 소프트가 그 필요성을 깨달았 기 때문에 아마도 appsettings.json
의 대안 일 수도 있습니다. FW에서 이전과 동일하게 작동합니다. 한 가지 차이점이 있습니다.
웹 애플리케이션에서 [예 : ASP.NET CORE WEB API]에서 appSettings
또는 configurationSection
에 대해 app.config
및 not web.config를 사용해야합니다. IIS를 통해 사이트를 배포하는 경우에만 web.config
를 사용해야 할 수도 있습니다. IIS 관련 설정을 web.config
netstandard20 DLL 및 Asp.net Core Web Api 그리고 그것은 모두 작동합니다.