.NET কোর কনসোল অ্যাপ্লিকেশনটির জন্য ASP.NET কোর কনফিগারেশন


135

এএসপি.নেট কোর এখানে একটি নতুন কনফিগারেশন সিস্টেমকে সমর্থন করে: https://docs.asp.net/en/latest/fundamentals/configration.html

এই মডেলটি। নেট কোর কনসোল অ্যাপ্লিকেশনগুলিতেও সমর্থিত?

না হলে আগের app.configএবং ConfigurationManagerমডেলের বিকল্প কী ?

উত্তর:


76

আপনি এই কোড স্নিপেট ব্যবহার করতে পারেন। এটিতে কনফিগারেশন এবং ডিআই অন্তর্ভুক্ত রয়েছে।

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

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

ওহ, এবং প্রকল্প.জসনে যুক্ত করতে ভুলবেন না

{
  "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। হ্যাকের পরে কোনও প্রয়োজন নেই।
ম্যাতিস

1
অথবা JSON ফাইলগুলির জন্য ভিজ্যুয়াল স্টুডিওতে "অনুলিপিতে ডিরেক্টরিতে অনুলিপি করুন" সম্পত্তিটি সেট করুন।
বুধীপ

ওয়েব কাজ করার বেস Dir জন্য কনসোল এবং Winforms আপনি এই পদ্ধতির ব্যবহার করতে পারেন stackoverflow.com/a/33675039/1818723
Pawel Cioch

গ্যারি উডফাইন এই পোস্টে খুব ভাল স্টাইলে এটিকে বিশদভাবে বর্ণনা করেছেন: garywoodfine.com/configration-api-net-core-console-application
জাভাদ নরোজি

@ জাভাদ কেবল আংশিক; আমি এখানেই শেষ হয়েছি কারণ আমি ডিআই অংশ চাইছিলাম, যা তিনি প্রতিশ্রুতি দিয়েছিলেন তবে আমি পাই নি। তিনি উদাহরণ হিসাবে যেমন একাধিক কনফিগারেশন ফাইল ব্যবহার করবেন তাও দেখান নি।
অস্পেক্স

232

.NET কোর 2.0 কনসোল অ্যাপের জন্য, আমি নিম্নলিখিতগুলি করেছি:

  1. প্রকল্পের মূলটিতে appsettings.json নামে একটি নতুন ফাইল তৈরি করুন (ফাইলের নাম কিছু হতে পারে)
  2. জেসন হিসাবে সেই ফাইলটিতে আমার নির্দিষ্ট সেটিংস যুক্ত করুন। উদাহরণ স্বরূপ:
{
  "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/configration?tabs=basicconfigration#simple-configration


1
যেমন আমি লক্ষ্য করেছি যে মাইক্রোসফ্ট তাদের উদাহরণগুলিতে আইকনফিগুরেশন রুট ব্যবহার করে না, তবে আইকনফিগারেশন ব্যবহার করে।
aligin

3
IConfigurationRootএখনও নেট কোর 2.0 তে উপলব্ধ । এটি উত্তরাধিকার সূত্রে পেয়েছে IConfigurationতবে এটি এর উদ্ভূত কেস হিসাবে বিবেচিত যা সাধারণত ব্যবহৃত হয় না । নির্বিশেষে, কোড উদাহরণটি এটিকে অন্তর্ভুক্ত না করার এবং কোনও বিভ্রান্তি এড়াতে আপডেট করা হয়েছে।
রায়

10
2 দ্রষ্টব্য: 4 পয়েন্টে আপনার কেবল মাইক্রোসফ্টের দরকার আছে। দ্বিতীয়: আপনি যদি কোনও অধ্যায়টিতে একটি বিভাগ লোড করতে চান, তবে এটি জানার জন্য দরকারী: var বিকল্পগুলি = নতুন FooOptions (); কনফিগারেশনবিন্ডার.বাইন্ড (কনফিগারেশন.গেটসেকশন ("foo"), বিকল্পগুলি); আপনার দরকার মাইক্রোসফ্ট.এক্সটেনশনস.অপশনস.কনফিগারেশন
এক্সটেনশনস

1
পাবলিক ক্লাস FooOptions- পাবলিক স্ট্রিং myKey1 {পেতে; সেট;} পাবলিক স্ট্রিং myKey2 {get; set;;}
ইয়েপাইকাই

2
সরঞ্জামসমূহ> ন্যুগেট প্যাকেজ ম্যানেজার> প্যাকেজ ম্যানেজার কনসোল .. .. ইনস্টল-প্যাকেজ মাইক্রোসফ্ট।
এক্সটেনশনস.কনফিগারেশন

19

আপনি ব্যবহার করেন তাহলে Microsoft.Extensions.Hosting(সংস্করণ 2.1.0+) আপনার কনসোল অ্যাপ্লিকেশন এবং asp.net কোর অ্যাপ্লিকেশন হোস্ট করার জন্য, আপনার সমস্ত কনফিগারেশনের সঙ্গে ইনজেকশনের হয় HostBuilders 'এর 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 Zhou

একটি মৃত লিঙ্ক যে @FeiyuZhou
Auspex

অপ্রয়োজনীয় এই সমাধানের সব কি না new HostBuilder()? সব কি HostBuilderঅভ্যন্তরীণভাবে করে না?
অ্যাসপেক্স

@ অ্যাসপেক্স এটি আপনার কনসোল অ্যাপটিকে কীভাবে সংজ্ঞায়িত করে তার উপর নির্ভর করে। আপনার যদি কাস্টম কনফিগারেশন সংজ্ঞায়িত করতে হয় তবে আপনার এটির মতো সেট করা উচিত। ডটনেট কোর 3.0 এর জন্য এখানে ডকটি রয়েছে: ডকস.মাইক্রোসফটি.এইন
ইউএস

10

আমি ভুল করেছিলাম. আপনি ConfigurationBuilderনেটকোর কনসোল অ্যাপ্লিকেশন থেকে নতুনটি ব্যবহার করতে পারেন ।

উদাহরণের জন্য https://docs.asp.net/en/latest/fundamentals/configration.html দেখুন ।

তবে, কেবলমাত্র অ্যাসনেট কোরের বাক্সের বাইরে নির্ভরতা ইঞ্জেকশন রয়েছে যাতে আপনার দৃ strongly়ভাবে কনফিগারেশন সেটিংস টাইপ করার ক্ষমতা নেই এবং সেগুলি ব্যবহার করে স্বয়ংক্রিয়ভাবে ইনজেক্ট করতে হবে IOptions


9
এই উত্তরটি বৈধ, তবে এটিতে প্রয়োজনীয় কোড থাকা উচিত, সুতরাং কোনও অগ্রগতি হবে না।
ম্যাতিস

4
আপনার যা দরকার তা হ'ল প্যাকেজ যুক্ত করুন: Microsoft.Extensions.Optionsএবং কল করুনservice.AddOptions();
ব্রুনো গার্সিয়া

2
সম্পূর্ণ (খুব দীর্ঘ) লিঙ্কযুক্ত পৃষ্ঠাটি প্রতিটি উদাহরণে "ওয়েবহোস্ট" এর উল্লেখ সহ এএসপি.এনইটি সম্পর্কিত বলে মনে হচ্ছে। লিঙ্কযুক্ত পৃষ্ঠাটি সন্ধান করার পরে "ঠিক আছে, এটি এএসপি.এনইটি, কনসোল অ্যাপ্লিকেশনগুলি সম্পর্কে কি" চিন্তা করার পরে আমি এই এই প্রশ্নে পৌঁছেছি।
ম্যাকেনির

এটি কিছুটা অদ্ভুত, @ ম্যাকেনির, কারণ 3.0 এ সমস্ত রিফ্যাক্টর হয়েছে যাতে এটি কেবলমাত্র হোস্ট! ওয়েবহোস্টের কেবলমাত্র রেফারেন্সটি আপনাকে 2.2 ডকুমেন্টেশনের দিকে নির্দেশ করে। এগুলি কিছুটা পরিষ্কার হতে পারে যে ConfigureWebHostDefaults()উদাহরণগুলির মধ্যে কলগুলি .চ্ছিক এবং কেবলমাত্র ওয়েব অ্যাপ্লিকেশনের জন্য।
অস্পেক্স

4

এটি ডটনেট ২.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

নেট কোর 3.1 তে আমাদের কেবল এটি করা দরকার:

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

সেরিলগ ব্যবহার করে দেখতে দেখতে এটি দেখতে পাবেন:

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": {
    "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

আপনি এটির জন্য লাইটওয়্যার . কনফিগারেশন লাইব্রেরি ব্যবহার করতে পারেন । এটি নেট ফ্রেমওয়ার্ক মূলের সাথে খুব অনুরূপ ConfigurationManagerএবং। নেট কোর / স্ট্যান্ডার্ডের জন্য কাজ করে। কোড-ভিত্তিক, আপনি এরকম কিছু দিয়ে শেষ করবেন:

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

দাবি অস্বীকার: আমি লাইটওয়্যার.কনফিগারেশনের লেখক।


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

মাইসেটেটিং কনফিগ ক্লাস:

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

আপনার অ্যাপসেটিংগুলি এর চেয়ে সহজ হতে পারে: এখানে চিত্র বর্ণনা লিখুন

এছাড়াও, নতুন হয়ে থাকলে অ্যাপসেটিং ফাইলগুলি সামগ্রী / অনুলিপিতে সেট করুন: সন্তুষ্ট

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.