it-swarm-ko.com

ASP.NET 코어의 모든 클래스에서 구성에 액세스하려면 어떻게합니까?

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 개의 키 - 값 쌍만 있습니다. 방금 응용 프로그램의 구성에 액세스하고 싶었습니다. 어떤 수업에도 어떻게 주입합니까?

82
LP13

최신 정보

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);

   // ...
}

ConfigurationStartup 클래스의 인스턴스입니다.

이렇게하면 컨트롤러 또는 서비스에 IConfiguration을 삽입 할 수 있습니다.

public class HomeController
{
   public HomeController(IConfiguration configuration)
   {
      // Use IConfiguration instance
   }
}
113
Henk Mollema

나는 이것이 오래되었음을 알고 있지만 IOptions 패턴을 구현하는 것이 상대적으로 간단하다.

  1. 구성의 설정과 일치하는 공개 get/set 속성이있는 클래스

    public class ApplicationSettings
    {
        public string UrlBasePath { get; set; }
    }
    
  2. 설정 등록

    public void ConfigureServices(IServiceCollection services)
    {
     ...
     services.Configure<ApplicationSettings>(Configuration.GetSection("ApplicationSettings"));
    ...
    }
    
  3. iOptions를 통해 주입

    public class HomeController
    {
       public HomeController(IOptions<ApplicationSettings> appSettings)
       { ...
        appSettings.Value.UrlBasePath
        ...
        // or better practice create a readonly private reference
        }
     }
    

나는 왜 당신이 이것을하지 않을지 확신하지 못합니다.

20
ScottC

올바른 방법 :

.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.csConfigureServices() 메소드에서 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를 사용하십시오.

첫 번째 옵션이 올바른 방법 인 이유와 마주 치지 마십시오. 숙련 된 개발자가 항상 길을 따라 쓰레기 데이터를 피하는 것을 볼 수 있습니다.로드가있는 것이 최선의 방법은 아니라는 것을 잘 알고 있습니다. 항상 메모리에있는 데이터를 사용할 수 있으며, 성능이나 개발에 적합하지 않으며, 필요할 때만 더 안전 할 수도 있습니다.

6
Mayer Spitzer

나는 옵션 패턴 샘플을 조사해 보았다 :

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
}
3
pursang

나는 지금 이렇게하고있다.

// 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"]
2
Tadej

또한 configuration을 startup.cs에서 정적으로 만드는 옵션을 사용하면 어디서나 쉽게 액세스 할 수 있으며 정적 변수는 편리합니다!

public Startup(IConfiguration configuration)
{
    Configuration = configuration;
}

internal static IConfiguration Configuration { get; private set; }

이렇게하면 Startup.Configuration.GetSection...를 사용하여 어디서나 구성에 액세스 할 수 있습니다. 무엇이 잘못 될 수 있습니까?

2
konzo

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 그리고 그것은 모두 작동합니다.

0
T.S.