.NET कोर कंसोल एप्लिकेशन के लिए ASP.NET कोर कॉन्फ़िगरेशन


135

ASP.NET Core एक नई विन्यास प्रणाली का समर्थन करता है जैसा कि यहाँ देखा गया है: https://docs.asp.net/en/latest/fundamentals/configuration.html

क्या यह मॉडल .NET कोर कंसोल अनुप्रयोगों में भी समर्थित है?

यदि नहीं, तो पिछले app.configऔर ConfigurationManagerमॉडल के लिए वैकल्पिक क्या है ?

जवाबों:


76

आप इस कोड स्निपेट का उपयोग कर सकते हैं। इसमें कॉन्फ़िगरेशन और DI शामिल हैं।

public class Program
{
    public static ILoggerFactory LoggerFactory;
    public static IConfigurationRoot Configuration;

    public static void Main(string[] args)
    {
        Console.OutputEncoding = Encoding.UTF8;

        string environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

        if (String.IsNullOrWhiteSpace(environment))
            throw new ArgumentNullException("Environment not found in ASPNETCORE_ENVIRONMENT");

        Console.WriteLine("Environment: {0}", environment);

        var services = new ServiceCollection();

        // Set up configuration sources.
        var builder = new ConfigurationBuilder()
            .SetBasePath(Path.Combine(AppContext.BaseDirectory))
            .AddJsonFile("appsettings.json", optional: true);
        if (environment == "Development")
        {

            builder
                .AddJsonFile(
                    Path.Combine(AppContext.BaseDirectory, string.Format("..{0}..{0}..{0}", Path.DirectorySeparatorChar), $"appsettings.{environment}.json"),
                    optional: true
                );
        }
        else
        {
            builder
                .AddJsonFile($"appsettings.{environment}.json", optional: false);
        }

        Configuration = builder.Build();

        LoggerFactory = new LoggerFactory()
            .AddConsole(Configuration.GetSection("Logging"))
            .AddDebug();

        services
            .AddEntityFrameworkNpgsql()
            .AddDbContext<FmDataContext>(o => o.UseNpgsql(connectionString), ServiceLifetime.Transient);

        services.AddTransient<IPackageFileService, PackageFileServiceImpl>();

        var serviceProvider = services.BuildServiceProvider();

        var packageFileService = serviceProvider.GetRequiredService<IPackageFileService>();

        ............
    }
}

ओह, और project.json में जोड़ना मत भूलना

{
  "version": "1.0.0-*",
  "buildOptions": {
    "emitEntryPoint": true,
    "copyToOutput": {
      "includeFiles": [
        "appsettings.json",
        "appsettings.Integration.json",
        "appsettings.Production.json",
        "appsettings.Staging.json"
      ]
    }
  },

  "publishOptions": {
    "copyToOutput": [
      "appsettings.json",
      "appsettings.Integration.json",
      "appsettings.Production.json",
      "appsettings.Staging.json"
    ]
  },
...
}

12
यह उत्तर आदर्श नहीं है। के Directory.GetCurrentDirectory()बजाय का उपयोग करें AppContext.BaseDirectory। बाद में हैक की कोई जरूरत नहीं होनी चाहिए।
Matasas

1
या JSON फ़ाइलों के लिए Visual Studio में "यदि नया है तो कॉपी करें" के लिए "आउटपुट निर्देशिका में प्रतिलिपि" संपत्ति सेट करें।
बुद्धिप

बेस डिअर के लिए वेब, कंसोल और
विनफॉर्म

गैरी वुडफिन ने इस पोस्ट पर बहुत अच्छे अंदाज में इसका वर्णन किया: garywoodfine.com/configuration-ap-net-core-console-application
Javad Norouzi

@ जावद केवल आंशिक रूप से; मैं यहाँ समाप्त हुआ क्योंकि मैं डि भाग चाहता था, जो उसने वादा किया था लेकिन मुझे नहीं मिला। उन्होंने यह भी नहीं दिखाया कि इस तरह से कई कॉन्फिग फाइल का इस्तेमाल कैसे किया जाता है।
शुभांक

232

.NET कोर 2.0 कंसोल ऐप के लिए, मैंने निम्न कार्य किया:

  1. प्रोजेक्ट के मूल में appsettings.json नामक एक नई फ़ाइल बनाएं (फ़ाइल का नाम कुछ भी हो सकता है)
  2. उस फ़ाइल में json के रूप में मेरी विशिष्ट सेटिंग्स जोड़ें। उदाहरण के लिए:
{
  "myKey1" :  "my test value 1", 
  "myKey2" :  "my test value 2", 
  "foo" :  "bar" 
}
  1. फ़ाइल को आउटपुट निर्देशिका में कॉपी करने के लिए कॉन्फ़िगर करें जब भी परियोजना का निर्माण (वीएस -> समाधान एक्सप्लोरर -> राइट-क्लिक फ़ाइल में -> 'गुण' का चयन करें -> उन्नत -> आउटपुट निर्देशिका में कॉपी करें -> 'हमेशा कॉपी करें' का चयन करें)

  2. मेरी परियोजना में निम्नलिखित नगेट पैकेज स्थापित करें:

    • Microsoft.Extensions.Configuration.Json
  3. Program.cs (या जहाँ भी Main()स्थित है) में निम्नलिखित जोड़ें :

    static void Main(string[] args)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json");
    
        var configuration = builder.Build();
    
        // rest of code...
    }
  4. फिर निम्नलिखित में से किसी भी तरीके का उपयोग करके मूल्यों को पढ़ें:

    string myKey1 = configuration["myKey1"];
    Console.WriteLine(myKey1);
    
    string foo = configuration.GetSection("foo").Value;
    Console.WriteLine(foo);

अधिक जानकारी: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration?tabs=basicconfiguration#simple-configuration


1
जैसा कि मैंने देखा कि Microsoft अपने उदाहरणों में IConfigurationRoot का उपयोग नहीं करते हैं, लेकिन IConfiguration का उपयोग करते हैं।
एलिगिन

3
IConfigurationRootअभी भी .NET कोर 2.0 में उपलब्ध है । यह विरासत में मिला है, IConfigurationलेकिन इसे इसका एक व्युत्पन्न मामला माना जाता है जिसका आमतौर पर उपयोग नहीं किया जाता है । भले ही, कोड उदाहरण को इसे शामिल नहीं करने और किसी भी भ्रम से बचने के लिए अद्यतन किया गया है।
रे

10
2 नोट: बिंदु 4 पर, आपको केवल Microsoft.Extensions.Configuration.Json की आवश्यकता है ... इसमें अन्य 2 डिफ़ॉल्ट रूप से शामिल होंगे। दूसरा: यदि आप किसी अनुभाग को किसी वस्तु पर लोड करना चाहते हैं, तो यह जानना उपयोगी है: var विकल्प = new FooOptions (); कॉन्फ़िगरेशनबिंडर। बाइंड (कॉन्फ़िगरेशन। गेटसेक्शन ("फू"), विकल्प); आपको Microsoft.Extensions.Options.ConfigurationExtensions
Yepeekai

1
सार्वजनिक वर्ग FooOptions {सार्वजनिक स्ट्रिंग myKey1 {प्राप्त करें; set;} public string myKey2 {get; set;}}
Yepeekai

2
उपकरण> NuGet पैकेज प्रबंधक> पैकेज प्रबंधक कंसोल .. .. इंस्टॉल-पैकेज Microsoft.Extensions.Configuration .. इंस्टॉल-पैकेज Microsoft.Extensions.Configuration.FileExtensions .. स्थापित-पैकेज Microsoft.Extensions.Configuration.Json
मनोहर रेड्डी Poreddy

19

यदि आप Microsoft.Extensions.Hostingअपने कंसोल ऐप और asp.net कोर ऐप को होस्ट करने के लिए (संस्करण 2.1.0+) का उपयोग करते हैं, तो आपके सभी कॉन्फ़िगरेशन को HostBuilder's' ConfigureAppConfigurationऔर ConfigureHostConfigurationविधियों के साथ इंजेक्ट किया जाता है । यहां appsettings.jsonपर्यावरण और पर्यावरण चर को जोड़ने के बारे में डेमो दिया गया है :

    var hostBuilder = new HostBuilder()
        .ConfigureHostConfiguration(config =>
        {
            config.AddEnvironmentVariables();

            if (args != null)
            {
                // enviroment from command line
                // e.g.: dotnet run --environment "Staging"
                config.AddCommandLine(args);
            }
        })
        .ConfigureAppConfiguration((context, builder) =>
        {
            var env = context.HostingEnvironment;
            builder.SetBasePath(AppContext.BaseDirectory)
            .AddJsonFile("appsettings.json", optional: false)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            // Override config by env, using like Logging:Level or Logging__Level
            .AddEnvironmentVariables();

        })
        ... // add others, logging, services
        //;

उपरोक्त कोड को संकलित करने के लिए, आपको इन पैकेजों को जोड़ना होगा:

<PackageReference Include="Microsoft.Extensions.Configuration" Version="2.1.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.CommandLine" Version="2.1.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="2.1.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.1.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="2.1.0" />

पर्यावरण कैसे निर्धारित होता है? अगर मैं लॉन्चशेटिंग में एक प्रोफ़ाइल बनाता हूं, तो यह वास्तव में सेट होता है, ASPNETCORE_ENVIRONMENTलेकिन फिर context.HostingEnvironment.EnvironmentNameसही तरीके से सेट नहीं किया जा रहा है
सिनास्टैटिक

आपको कुंजी के रूप में पर्यावरण का उपयोग करना चाहिए, इस कोड की जांच करें: github.com/aspnet/Hosting/blob/dev/src/…
Feiyu झोउ

@FeiyuZhou यह एक मृत लिंक है
Auspex

क्या यह सब समाधान new HostBuilder()निरर्थक के बाद नहीं है ? नहीं है HostBuilderयह सब आंतरिक रूप से करते हैं?
शुभ अंक

@ ऐप्लेक्स यह इस बात पर निर्भर करता है कि आप अपने कंसोल ऐप को कैसे परिभाषित करते हैं। यदि आपको कस्टम कॉन्फ़िगरेशन को परिभाषित करने की आवश्यकता है, तो आपको इस तरह सेट करना चाहिए। यहाँ डॉटनेट
Feiyu झोउ

10

मुझे गलत समझा गया था। आप ConfigurationBuilderनेटकोर कंसोल एप्लिकेशन से नए का उपयोग कर सकते हैं ।

एक उदाहरण के लिए https://docs.asp.net/en/latest/fundamentals/configuration.html देखें ।

हालाँकि, केवल एस्पनेट कोर में बॉक्स के बाहर निर्भरता इंजेक्शन है, ताकि आपके पास दृढ़ता से टाइप की गई कॉन्फ़िगरेशन सेटिंग्स होने की क्षमता नहीं है और स्वचालित रूप से उनका उपयोग करके इंजेक्ट करें IOptions


9
यह उत्तर मान्य है, लेकिन इसमें आवश्यक कोड होना चाहिए, इस प्रकार कोई अपवोट नहीं होगा।
मटका

4
आपको बस पैकेज जोड़ने की जरूरत है: Microsoft.Extensions.Optionsऔर कॉल करेंservice.AddOptions();
ब्रूनो गार्सिया

2
संपूर्ण (बहुत लंबा) जुड़ा हुआ पृष्ठ ASP.NET संबंधित प्रतीत होता है, जिसमें हर उदाहरण में "वेबहोस्ट" का उल्लेख है। लिंक किए गए पेज को खोजने और "ओके, दैट्स एएसपी.नेट, कंसोल के बारे में क्या है" के बारे में सोचने के बाद मुझे यह एसओ प्रश्न मिला।
मैकेनिक

यह थोड़ा अजीब है, @ मैकेनिअर, क्योंकि 3.0 में यह सब रिफैक्ट हो गया है, इसलिए यह सब सिर्फ होस्ट है! केवल वेबहॉस्ट का एकमात्र संदर्भ आपको 2.2 दस्तावेज की ओर इशारा करता है। वे थोड़े स्पष्ट हो सकते थे कि ConfigureWebHostDefaults()उदाहरणों में कॉल वैकल्पिक हैं, और केवल वेब ऐप्स के लिए।
शुभ अंक

4

यह कुछ ऐसा है, एक डॉटनेट 2.x कोर कंसोल एप्लीकेशन के लिए:

        using Microsoft.Extensions.Configuration;
        using Microsoft.Extensions.DependencyInjection;
        using Microsoft.Extensions.Logging;

        [...]
        var configuration = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddEnvironmentVariables()
            .Build();
        var serviceProvider = new ServiceCollection()
            .AddLogging(options => options.AddConfiguration(configuration).AddConsole())
            .AddSingleton<IConfiguration>(configuration)
            .AddSingleton<SomeService>()
            .BuildServiceProvider();
        [...]
        await serviceProvider.GetService<SomeService>().Start();

आप ILoggerFactory, IConfiguration को इंजेक्ट कर सकते हैं SomeService


2

.Net कोर 3.1 पर हमें बस ये करने की जरूरत है:

static void Main(string[] args)
{
  var configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
}

SeriLog का उपयोग करना पसंद करेंगे:

using Microsoft.Extensions.Configuration;
using Serilog;
using System;


namespace yournamespace
{
    class Program
    {

        static void Main(string[] args)
        {
            var configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
            Log.Logger = new LoggerConfiguration().ReadFrom.Configuration(configuration).CreateLogger();

            try
            {
                Log.Information("Starting Program.");
            }
            catch (Exception ex)
            {
                Log.Fatal(ex, "Program terminated unexpectedly.");
                return;
            }
            finally
            {
                Log.CloseAndFlush();
            }
        }
    }
}

और प्रतिदिन एक फ़ाइल बनाने के लिए Serilog appsetings.json अनुभाग इस तरह दिखाई देगा:

  "Serilog": {
    "MinimumLevel": {
      "Default": "Information",
      "Override": {
        "Microsoft": "Warning",
        "System": "Warning"
      }
    },
    "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
    "WriteTo": [
      {
        "Name": "File",
        "Args": {
          "path": "C:\\Logs\\Program.json",
          "rollingInterval": "Day",
          "formatter": "Serilog.Formatting.Compact.CompactJsonFormatter, Serilog.Formatting.Compact"
        }
      }
    ]
  }

पूरे वेब से उन सभी सिंटैक्स की कोशिश करने के बाद, आपका वही है जो मेरे लिए काम करता है, और यह इतना सरल है।
गणेश

मुझे खुशी है कि इससे आपको मदद मिली।
अर्नेस्ट

1

आप उसके लिए LiteWare.Configuration लाइब्रेरी का उपयोग कर सकते हैं । यह .NET फ्रेमवर्क मूल के समान है ConfigurationManagerऔर .NET Core / Standard के लिए काम करता है। कोड-वार, आप कुछ इस तरह से समाप्त करेंगे:

string cacheDirectory = ConfigurationManager.AppSettings.GetValue<string>("CacheDirectory");
ulong cacheFileSize = ConfigurationManager.AppSettings.GetValue<ulong>("CacheFileSize");

अस्वीकरण: मैं LiteWare.Configuration का लेखक हूं।


0

बस पर ... फियाउ झोउ के पद के समान। यहाँ मैं मशीन का नाम जोड़ रहा हूँ।

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
          .ConfigureAppConfiguration((context, builder) =>
          {
            var env = context.HostingEnvironment;
            var hostname = Environment.MachineName;
            builder.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
              .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
              .AddJsonFile($"appsettings.{hostname}.json", optional: true, reloadOnChange: true);
            builder.AddEnvironmentVariables();
            if (args != null)
            {
              builder.AddCommandLine(args);
            }
          })
        .UseStartup<Startup>();
  }

0

इन पैकेजों को स्थापित करें:

  • Microsoft.Extensions.Configuration
  • Microsoft.Extensions.Configuration.Binder
  • Microsoft.Extensions.Configuration.EnvironmentVariables
  • Microsoft.Extensions.Configuration.FileExtensions
  • Microsoft.Extensions.Configuration.Json

कोड:

static void Main(string[] args)
    {
        var environmentName = Environment.GetEnvironmentVariable("ENVIRONMENT");
        Console.WriteLine("ENVIRONMENT: " + environmentName);

        var builder = new ConfigurationBuilder()
           .SetBasePath(Directory.GetCurrentDirectory())
           .AddJsonFile("appsettings.json", false)
           .AddJsonFile($"appsettings.{environmentName}.json", true)
           .AddEnvironmentVariables();

        IConfigurationRoot configuration = builder.Build();
        var mySettingsConfig = configuration.Get<MySettingsConfig>();

        Console.WriteLine("URL: " + mySettingsConfig.Url);
        Console.WriteLine("NAME: " + mySettingsConfig.Name);

        Console.ReadKey();
    }

MySettingsConfig वर्ग:

public class MySettingsConfig
{
    public string Url { get; set; }
    public string Name { get; set; }
}

आपके ऐपेटिंग्स इस तरह सरल हो सकते हैं: यहाँ छवि विवरण दर्ज करें

इसके अलावा, यदि नया हो तो एप्लेटसेटिंग फाइल को कंटेंट / कॉपी पर सेट करें: सामग्री

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.