এএসপি.এনইটি কোর-তে জেসন ফাইল থেকে অ্যাপসেটেটিং মানগুলি কীভাবে পড়বেন


247

আমি ফাইল অ্যাপসেটেটিং / কনফিগারেশন .জেএসনে আমার অ্যাপসেটেটিং ডেটা সেট আপ করেছি:

{
  "AppSettings": {
        "token": "1234"
    }
}

.Json ফাইল থেকে অ্যাপসেটিং মানগুলি কীভাবে পড়তে হয় সে সম্পর্কে আমি অনলাইনে অনুসন্ধান করেছি, তবে আমি কার্যকর কিছু পেতে পারি না।

আমি চেষ্টা করেছিলাম:

var configuration = new Configuration();
var appSettings = configuration.Get("AppSettings"); // null
var token = configuration.Get("token"); // null

আমি এএসপি.নেট 4.0 এর সাথে জানি আপনি এটি করতে পারেন:

System.Configuration.ConfigurationManager.AppSettings["token"];

তবে আমি এএসপি.নেট কোর এ কীভাবে করব?




এটি কেবলমাত্র আইকনফিগারেশনের নির্ভরতা ইনজেকশন ব্যবহার করে সহজ করা যেতে পারে (নেট কোর ২.০)। যা এখানে কোডিং-issues.com.com88
রেড্ডি

@ রানাধিরেডি, নির্ভরতা ইনজেকশন নিয়ন্ত্রণকারীদের জন্য কাজ করে। তবে মিডলওয়্যারটিতে যদি কারও কোনও মান পড়ার প্রয়োজন হয়?
আলেকজান্ডার রায়ান ব্যাগেট

উত্তর:


319

এতে কয়েকটি বাঁক ও পালা হয়েছে। আমি এই উত্তরটি এএসপি.নেট কোর 2.0 (26/02/2018 পর্যন্ত) সাথে আপ টু ডেট হতে সংশোধন করেছি ।

এটি বেশিরভাগ সরকারী নথি থেকে নেওয়া :

আপনার এএসপি.এনইটি অ্যাপ্লিকেশনটিতে সেটিংস নিয়ে কাজ করার জন্য, আপনি কেবলমাত্র Configurationআপনার অ্যাপ্লিকেশনটির Startupক্লাসে ইনস্ট্যান্ট করার পরামর্শ দেওয়া হয় । তারপরে, পৃথক সেটিংস অ্যাক্সেস করতে বিকল্প প্যাটার্নটি ব্যবহার করুন। ধরা যাক আমাদের কাছে এমন একটি appsettings.jsonফাইল রয়েছে যা দেখতে দেখতে:

{
  "MyConfig": {
   "ApplicationName": "MyApp",
   "Version": "1.0.0"
   }

}

এবং কনফিগারেশনের প্রতিনিধিত্বকারী আমাদের একটি পোকো অবজেক্ট রয়েছে:

public class MyConfig
{
    public string ApplicationName { get; set; }
    public int Version { get; set; }
}

এখন আমরা এতে কনফিগারেশন তৈরি করি Startup.cs:

public class Startup 
{
    public IConfigurationRoot Configuration { get; set; }

    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);

        Configuration = builder.Build();
    }
}

নোট .NET কোর 2.0 তে ডিফল্টরূপে নিবন্ধভুক্তappsettings.json হবে Note প্রয়োজনে আমরা পরিবেশের জন্য একটি কনফিগার ফাইলও নিবন্ধভুক্ত করতে পারি ।appsettings.{Environment}.json

আমরা যদি আমাদের নিয়ন্ত্রণকারীদের কাছে আমাদের কনফিগারেশনটি ইনজেক্ট করতে চাই তবে আমাদের এটি রানটাইম দিয়ে নিবন্ধিত করতে হবে। আমরা এর মাধ্যমে এটি করি Startup.ConfigureServices:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    // Add functionality to inject IOptions<T>
    services.AddOptions();

    // Add our Config object so it can be injected
    services.Configure<MyConfig>(Configuration.GetSection("MyConfig"));
}

এবং আমরা এটি এর মতো ইনজেকশন করি:

public class HomeController : Controller
{
    private readonly IOptions<MyConfig> config;

    public HomeController(IOptions<MyConfig> config)
    {
        this.config = config;
    }

    // GET: /<controller>/
    public IActionResult Index() => View(config.Value);
}

সম্পূর্ণ Startupশ্রেণি:

public class Startup 
{
    public IConfigurationRoot Configuration { get; set; }

    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);

        Configuration = builder.Build();
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();

        // Add functionality to inject IOptions<T>
        services.AddOptions();

        // Add our Config object so it can be injected
        services.Configure<MyConfig>(Configuration.GetSection("MyConfig"));
    }
}

3
সংস্করণ "1.0.0-beta4"আমার উপর কাজ করে না "1.0.0-alpha4"। অনেক ধন্যবাদ!
ওলুওয়াফেমি

2
আমাকে একটি ইউটিলিটি ক্লাস থেকে অন্য স্তরে একটি সেটিং পাস করতে হবে যাতে আমার এই সার্বজনীন স্ট্যাটিক স্ট্রিং গেটকনেকশনস্ট্রিং () এর মতো কিছু দরকার {যদি (স্ট্রিং.আইএসনুলআরম্পিটি (কানেকশনস্ট্রিং)) {var বিল্ডার = নতুন কনফিগারেশনবিল্ডার () .এডজে জেএসফোন ("config.json" "); কনফিগারেশন = বিল্ডার। বিল্ড (); সংযোগস্ট্রিং = কনফিগারেশন.গেট ("ডেটা: ডিফল্ট সংযোগ: সংযোগস্ট্রিং"); }} রিটার্ন কানেকশন স্ট্রিং; }
dnxit

2
আমি পেয়েছিArgument 2: cannot convert from 'Microsoft.Extensions.Configuration.IConfigurationSection' to 'System.Action<....Settings>'
পিটার

5
নুগেট যুক্ত করার পরে Microsoft.Extensions.Options.ConfigurationExtensionsএটি প্রত্যাশার মতো কাজ করেছিল।
পিটার

2
কনফিগারেশন প্রক্রিয়া যুক্তি সম্পর্কে দুর্দান্ত ব্যাখ্যা, তবে এটি একটি প্রধান বিষয়টিকে মিস করে: সেটবেসপথ () এবং অ্যাডজসনফিল () এক্সটেনশন পদ্ধতি যা পৃথক অ্যাসেমব্লির ফ্রেমওয়ার্কে গভীরভাবে বহন করে। সুতরাং শুরু করার জন্য, মাইক্রোসফ্ট.এক্সটেনশনগুলি.কনফিগারেশন ছাড়াও মাইক্রোসফ্ট.এক্সটেনশনস.কনফিগারেশন.ফাইএল এক্সটেনশনস এবং মাইক্রোসফ্ট.এক্সটেনশনস.কনফিগারেশন.জসন ইনস্টল করা দরকার।
বোজিদার স্টোনিফ

63

প্রথম বন্ধ: মাইক্রোসফ্টের সমাবেশের নাম এবং নেমস্পেস ra ফ্রেমওয়ার্ক C কনফিগারেশনমোডেলটি মাইক্রোসফ্টে পরিণত হয়েছে ra ফ্রেমওয়ার্ক C কনফিগারেশন। সুতরাং আপনার ব্যবহার করা উচিত: যেমন

"Microsoft.Framework.Configuration.Json": "1.0.0-beta7"

একটি নির্ভরতা হিসাবে project.json। আপনার কাছে 7 টি ইনস্টল না থাকলে বিটা 5 বা 6 ব্যবহার করুন। তারপরে আপনি এ জাতীয় কিছু করতে পারেন Startup.cs

public IConfiguration Configuration { get; set; }

public Startup(IHostingEnvironment env, IApplicationEnvironment appEnv)
{
     var configurationBuilder = new ConfigurationBuilder(appEnv.ApplicationBasePath)
        .AddJsonFile("config.json")
        .AddEnvironmentVariables();
     Configuration = configurationBuilder.Build();
}

এরপরে আপনি যদি কনফিগারেশন থেকে কোনও পরিবর্তনীয় পুনরুদ্ধার করতে চান তবে আপনি এখনই এটি ব্যবহার করে তা পেতে পারেন:

public void Configure(IApplicationBuilder app)
{
    // Add .Value to get the token string
    var token = Configuration.GetSection("AppSettings:token");
    app.Run(async (context) =>
    {
        await context.Response.WriteAsync("This is a token with key (" + token.Key + ") " + token.Value);
    });
}

অথবা আপনি অ্যাপসেটিংস নামে একটি শ্রেণি তৈরি করতে পারেন:

public class AppSettings
{
    public string token { get; set; }
}

এবং এই জাতীয় পরিষেবাদিগুলি কনফিগার করুন:

public void ConfigureServices(IServiceCollection services)
{       
    services.AddMvc();

    services.Configure<MvcOptions>(options =>
    {
        //mvc options
    });

    services.Configure<AppSettings>(Configuration.GetSection("AppSettings"));
}

এবং তারপরে এটির মাধ্যমে অ্যাক্সেস করুন যেমন একটি নিয়ামক:

public class HomeController : Controller
{
    private string _token;

    public HomeController(IOptions<AppSettings> settings)
    {
        _token = settings.Options.token;
    }
}

আপনি কি দয়া করে রেফারেন্সের জন্য "অ্যাপসেটেটিংস" এর জন্য কনফিগারেশন জেসনটি ভাগ করতে পারেন
অঙ্কিত মরি

আমার ক্লাসে পুরো অ্যাপসেটেটিংস.জসন কনফিগারেশন দরকার, এর জন্য, আমি জেএসওএন অনুসারে ক্লাস ডিজাইন করেছি এবং Configuration.Get<AppSettings>()একটি নির্দিষ্ট বিভাগের পরিবর্তে পুরো ফাইলটি ডিজায়ালাইজ করতে ব্যবহার করেছি ।
নিলে

52

.NET কোর 2.0 এর জন্য, কিছুটা পরিবর্তন হয়েছে changed স্টার্টআপ কনস্ট্রাক্টর একটি প্যারামিটার হিসাবে কনফিগারেশন অবজেক্ট নেয়, সুতরাং এটি ব্যবহার করেConfigurationBuilder প্রয়োজন নেই। আমারটা এখানে:

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.Configure<StorageOptions>(Configuration.GetSection("AzureStorageConfig"));
}

আমার পোকো StorageOptions শীর্ষে উল্লিখিত বস্তু:

namespace FictionalWebApp.Models
{
    public class StorageOptions
    {
        public String StorageConnectionString { get; set; }
        public String AccountName { get; set; }
        public String AccountKey { get; set; }
        public String DefaultEndpointsProtocol { get; set; }
        public String EndpointSuffix { get; set; }

        public StorageOptions() { }
    }
}

এবং কনফিগারেশনটি আসলে আমার একটি সাবমিশন appsettings.json ফাইলটির , নামযুক্ত AzureStorageConfig:

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;",
    "StorageConnectionString": "DefaultEndpointsProtocol=https;AccountName=fictionalwebapp;AccountKey=Cng4Afwlk242-23=-_d2ksa69*2xM0jLUUxoAw==;EndpointSuffix=core.windows.net"
  },
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  },

  "AzureStorageConfig": {
    "AccountName": "fictionalwebapp",
    "AccountKey": "Cng4Afwlk242-23=-_d2ksa69*2xM0jLUUxoAw==",
    "DefaultEndpointsProtocol": "https",
    "EndpointSuffix": "core.windows.net",
    "StorageConnectionString": "DefaultEndpointsProtocol=https;AccountName=fictionalwebapp;AccountKey=Cng4Afwlk242-23=-_d2ksa69*2xM0jLUUxoAw==;EndpointSuffix=core.windows.net"
  }
}

কেবলমাত্র আমি যুক্ত করব, যেহেতু নির্মাণকারীর পরিবর্তন হয়েছে, তাই লোড করার জন্য এর appsettings.<environmentname>.jsonবিপরীতে অতিরিক্ত কিছু করা দরকার কিনা তা আমি পরীক্ষা করিনি appsettings.json


আপনাকে এখনও টস করতে হবে এমন একটি নোট .এডিজেজেসনফাইলে ("yourfile.json") কনফিগার কনফিগারেশন এ যোগ করুন। IE, ফাইলটি কোথায় আছে তা আপনাকে জানাতে হবে। উত্তরে তা দেখেনি।
এরিক

এরিক আমি এটিকে পরীক্ষা করব, আমি মনে করি না যে লাইনটি যুক্ত করা; এটি কেবল তখনই প্রয়োজনীয় হতে পারে যদি জসন ফাইলের নাম ডিফল্ট নাম না থাকে?
MDMoore313

এমএসডিএন অনুসারে, এটি এসপিএনটেকোর ২.০ এর জন্য প্রয়োজনীয় নয়, যদিও এটি আমার পক্ষে কাজ করে না বলে মনে হয়। ডকস.মাইক্রোসফট.ইন- ইউএস
শনি থিরু

1
আমি নিশ্চিত করতে পারি যে আমাকে কনফিগারেশনবিল্ডার () অবজেক্ট তৈরি করতে হয়েছিল এবং কনফিগার অভিধানে অ্যাপসেটেটিংস.জসন ফাইলগুলি লোড করতে অ্যাডজেএসএনফাইলে () কল করতে হয়েছিল। এটি এএসপি.এনইটি কোর ২.০ এমএসডিএন যা বলছে তার বিপরীতে এটি কি একটি বাগ রয়েছে?
শনি থিরু

1
আপনি কীভাবে একটি নিয়ন্ত্রণ দিতে পারেন আপনি কীভাবে আপনার নিয়ন্ত্রণকারীগুলিতে স্টোরেজঅ্যাপশনগুলি ইনজেক্ট করেন? যদি আমি আলিঙ্গনের সাথে নির্ভরতা ইনজেকশনটি ব্যবহার করার পদ্ধতিকে ব্যবহার করি তবে আমি public HomeController(IOptions<StorageOptions> settings)এই ত্রুটি বার্তাটি পাই: মডেল সীমাবদ্ধ জটিল ধরণের অবশ্যই বিমূর্ত বা মানের ধরণের হতে হবে না এবং অবশ্যই একটি প্যারামিটারলেস কনস্ট্রাক্টর থাকতে হবে।
জেপসি

30

.NET কোর 2.2 এর সাথে এবং সহজতম পদ্ধতিতে ...

public IActionResult Index([FromServices] IConfiguration config)
{
    var myValue = config.GetValue<string>("MyKey");
}

appsettings.jsonকনস্ট্রাক্টর বা অ্যাকশন ইঞ্জেকশনের মাধ্যমে স্বয়ংক্রিয়ভাবে লোড করা এবং উপলব্ধ এবং এটির একটি GetSectionপদ্ধতিও রয়েছে IConfiguration। কোনও পরিবর্তন করার দরকার নেই Startup.csবা Program.csআপনার যা যা প্রয়োজন তা হ'ল appsettings.json


2
এমনকি সহজ:var myValue = config["MyKey"]
জোকব

... এবং আপনি করতে পারেন: json এর অভ্যন্তরে উপাদানগুলি পেতে কনফিগার করুন ["স্টোরেজ: কানেকশনস্ট্রিং"]। আমি নিশ্চিত করতে পারি যে এই কৌশলটি। নেট কোর 3 এ কাজ করে এবং নির্মাণ ইঞ্জেকশনটিতে কাজ করে।
মারিও মাইরেলিস

29

আপনি যদি কেবল টোকেনের মান পেতে চান তবে ব্যবহার করুন

Configuration["AppSettings:token"]


4
এটি কাজ করার জন্য আপনাকে কনফিগারেশন বিল্ডারের মাধ্যমে আগেই একটি আইকনফিগারেশন দৃষ্টান্ত শুরু করতে হবে।
Г И І И О

20

.NET কোর 3.0

সম্ভবত এটি appsettings.json থেকে কোনও মূল্য পাওয়ার সেরা উপায় নয় তবে এটি সহজ এবং এটি আমার অ্যাপ্লিকেশনটিতে কাজ করে !!

ফাইল অ্যাপসেটেটিংস.জসন

{
    "ConnectionStrings": {
        "DefaultConnection":****;"
    }

    "AppSettings": {
        "APP_Name": "MT_Service",
        "APP_Version":  "1.0.0"
    }
}

নিয়ন্ত্রক:

শীর্ষে :

using Microsoft.Extensions.Configuration;

আপনার কোডে:

var AppName = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build().GetSection("AppSettings")["APP_Name"];

অনেকটাই অকপট. এর জন্য আপনাকে ধন্যবাদ, আপনি আমাকে সাহায্য করেছেন!
ম্যাট

অ্যাডজেসনফিল কনফিগারেশনবিল্ডারে নেই
এসেসে

10

নিম্নলিখিত কনসোল অ্যাপ্লিকেশনগুলির জন্য কাজ করে;

  1. নিম্নলিখিত নিউগেট প্যাকেজ ইনস্টল করুন ( .csproj);

    <ItemGroup>
        <PackageReference Include="Microsoft.Extensions.Configuration" Version="2.2.0-preview2-35157" />
        <PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="2.2.0-preview2-35157" />
        <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.2.0-preview2-35157" />
    </ItemGroup>
  2. appsettings.jsonমূল স্তরে তৈরি করুন । এটিতে রাইট ক্লিক করুন এবং "আরও নতুন কপি করুন " হিসাবে "আউটপুট ডিরেক্টরিতে অনুলিপি করুন "।

  3. নমুনা কনফিগারেশন ফাইল:

    {
      "AppConfig": {
        "FilePath": "C:\\temp\\logs\\output.txt"
      }
    }
  4. Program.cs

    configurationSection.Keyএবং configurationSection.Valueকনফিগার বৈশিষ্ট্য থাকবে।

    static void Main(string[] args)
    {
        try
        {
    
            IConfigurationBuilder builder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
    
            IConfigurationRoot configuration = builder.Build();
            // configurationSection.Key => FilePath
            // configurationSection.Value => C:\\temp\\logs\\output.txt
            IConfigurationSection configurationSection = configuration.GetSection("AppConfig").GetSection("FilePath");
    
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
    }

8

.NET কোর 2.0 এর জন্য, আপনি কেবল:

আপনার কী / মান যুক্তগুলি অ্যাপসেটেটিং.জেসনে ঘোষণা করুন:

{
  "MyKey": "MyValue"
}

Startup.cs এ কনফিগারেশন পরিষেবাটি ইনজেক্ট করুন এবং পরিষেবাটি ব্যবহার করে মান পাবেন

using Microsoft.Extensions.Configuration;

public class Startup
{
    public void Configure(IConfiguration configuration,
                          ... other injected services
                          )
    {
        app.Run(async (context) =>
        {
            string myValue = configuration["MyKey"];
            await context.Response.WriteAsync(myValue);
        });

8

আমি সন্দেহ করি এটি ভাল অনুশীলন তবে এটি স্থানীয়ভাবে কাজ করছে। আমি প্রকাশ করব / মোতায়েন করার সময় (আইআইএস ওয়েব পরিষেবাতে) ব্যর্থ হলে এটি আপডেট করব।

পদক্ষেপ 1 - এই সমাবেশটি আপনার শ্রেণীর শীর্ষে যুক্ত করুন (আমার ক্ষেত্রে, নিয়ামক শ্রেণিতে):

using Microsoft.Extensions.Configuration;

পদক্ষেপ 2 - এটি বা এটির মতো কিছু যুক্ত করুন:

var config = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json").Build();

পদক্ষেপ 3 - এটি করে (কীভাবে স্ট্রিং প্রদান করে) আপনার কীটির মানটি কল করুন:

config["NameOfYourKey"]

আমি মনে করি এটি জরিমানা করা উচিত appsettings.jsonযদি সঠিক ডিরেক্টরিতে থাকে
Ju66ernaut

7

শুধু ইউভাল ইতজকভ উত্তরটি পরিপূরক করতে।

আপনি বিল্ডার ফাংশন ছাড়াই কনফিগারেশন লোড করতে পারেন, আপনি এটি কেবল ইনজেক্ট করতে পারেন।

public IConfiguration Configuration { get; set; }

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

6

বিদ্যমান উত্তরের পাশাপাশি আমি উল্লেখ করতে চাই যে কখনও কখনও সরলতার জন্য এক্সটেনশন পদ্ধতি ব্যবহার করা কার্যকর হতে পারে IConfiguration

আমি JWT কনফিগারেশনটিকে appsettings.json এ রাখি যাতে আমার এক্সটেনশন পদ্ধতিগুলির ক্লাসটি নীচের মতো দেখায়:

public static class ConfigurationExtensions
{
    public static string GetIssuerSigningKey(this IConfiguration configuration)
    {
        string result = configuration.GetValue<string>("Authentication:JwtBearer:SecurityKey");
        return result;
    }

    public static string GetValidIssuer(this IConfiguration configuration)
    {
        string result = configuration.GetValue<string>("Authentication:JwtBearer:Issuer");
        return result;
    }

    public static string GetValidAudience(this IConfiguration configuration)
    {
        string result = configuration.GetValue<string>("Authentication:JwtBearer:Audience");
        return result;
    }

    public static string GetDefaultPolicy(this IConfiguration configuration)
    {
        string result = configuration.GetValue<string>("Policies:Default");
        return result;
    }

    public static SymmetricSecurityKey GetSymmetricSecurityKey(this IConfiguration configuration)
    {
        var issuerSigningKey = configuration.GetIssuerSigningKey();
        var data = Encoding.UTF8.GetBytes(issuerSigningKey);
        var result = new SymmetricSecurityKey(data);
        return result;
    }

    public static string[] GetCorsOrigins(this IConfiguration configuration)
    {
        string[] result =
            configuration.GetValue<string>("App:CorsOrigins")
            .Split(",", StringSplitOptions.RemoveEmptyEntries)
            .ToArray();

        return result;
    }
}

এটি আপনাকে প্রচুর লাইন সাশ্রয় করে এবং আপনি কেবল পরিষ্কার এবং ন্যূনতম কোড লিখুন:

...
x.TokenValidationParameters = new TokenValidationParameters()
{
    ValidateIssuerSigningKey = true,
    ValidateLifetime = true,
    IssuerSigningKey = _configuration.GetSymmetricSecurityKey(),
    ValidAudience = _configuration.GetValidAudience(),
    ValidIssuer = _configuration.GetValidIssuer()
};

IConfigurationউদাহরণটি সিঙ্গলটন হিসাবে নিবন্ধন করা এবং আপনার যেখানেই প্রয়োজন সেখানে এটি ইনজেকশন করাও সম্ভব - আপনি কীভাবে এটি করেন তা আমি এখানে অটোফ্যাক ধারক ব্যবহার করি:

var appConfiguration = AppConfigurations.Get(WebContentDirectoryFinder.CalculateContentRootFolder());
builder.Register(c => appConfiguration).As<IConfigurationRoot>().SingleInstance();

আপনি এমএস নির্ভরতা ইনজেকশন দিয়েও এটি করতে পারেন:

services.AddSingleton<IConfigurationRoot>(appConfiguration);

6

এখানে এএসপি.নেট কোরের সম্পূর্ণ ব্যবহারের কেস!

articles.json

{
  "shownArticlesCount": 3,
  "articles": [
    {
      "title": "My Title 1",
      "thumbnailLink": "example.com/img1.png",
      "authorProfileLink": "example.com/@@alper",
      "authorName": "Alper Ebicoglu",
      "publishDate": "2018-04-17",
      "text": "...",
      "link": "..."
    },
    {
      "title": "My Title 2",
      "thumbnailLink": "example.com/img2.png",
      "authorProfileLink": "example.com/@@alper",
      "authorName": "Alper Ebicoglu",
      "publishDate": "2018-04-17",
      "text": "...",
      "link": "..."
    },
  ]
}

ArticleContainer.cs

public class ArticleContainer
{
    public int ShownArticlesCount { get; set; }

    public List<Article> Articles { get; set; }
}

public class Article
{
    public string Title { get; set; }

    public string ThumbnailLink { get; set; }

    public string AuthorName { get; set; }

    public string AuthorProfileLink { get; set; }

    public DateTime PublishDate { get; set; }

    public string Text { get; set; }

    public string Link { get; set; } 
}

Startup.cs

public class Startup
{
    public IConfigurationRoot ArticleConfiguration { get; set; }

    public Startup(IHostingEnvironment env)
    {
        ArticleConfiguration = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("articles.json")
            .Build();
    }

    public IServiceProvider ConfigureServices(IServiceCollection services)
    {
        services.AddOptions();

        services.Configure<ArticleContainer>(ArticleConfiguration);
    }
}

Index.cshtml.cs

public class IndexModel : PageModel
{
    public ArticleContainer ArticleContainer { get;set; }

    private readonly IOptions<ArticleContainer> _articleContainer;

    public IndexModel(IOptions<ArticleContainer> articleContainer)
    {
        _articleContainer = articleContainer;
    }

    public void OnGet()
    {
        ArticleContainer = _articleContainer.Value;
    }
}

Index.cshtml.cs

<h1>@Model.ArticleContainer.ShownArticlesCount</h1>

"এএসপি.নেট কোর" কোন সংস্করণ?
স্টিভ স্মিথ

5

তারা কেবল জিনিসগুলি পরিবর্তন করে চলেছে - সবেমাত্র ভিজ্যুয়াল স্টুডিও আপডেট করেছে এবং পুনরুদ্ধারের পথে পুরো প্রকল্প বোমাটি রেখেছিল এবং নতুন উপায়ে এটি দেখতে দেখতে:

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.IsDevelopment())
    {
        // For more details on using the user secret store see http://go.microsoft.com/fwlink/?LinkID=532709
        builder.AddUserSecrets();
    }

    builder.AddEnvironmentVariables();
    Configuration = builder.Build();
}

আমি এই লাইন মিস করছি!

.SetBasePath(env.ContentRootPath)

1
একই পদ্ধতি ব্যবহার করে আমরা কীভাবে পরীক্ষামূলক প্রকল্পগুলিতে অ্যাপসেটেটিং মানগুলি পেতে পারি?
এস শিভা

2
They just keep changing things। এই. এই পৃষ্ঠার প্রায় প্রতিটি উত্তর কেবলমাত্র নেট কোরের নির্দিষ্ট সংস্করণে প্রযোজ্য।
স্টিভ স্মিথ

4

.NET কোর 2.1.0

  1. রুট ডিরেক্টরিতে .json ফাইল তৈরি করুন
  2. আপনার কোডে:
var builder = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); 
var config = builder.Build();

3. নিম্নলিখিত নির্ভরতা ইনস্টল করুন:

Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.json

৪. তারপরে, গুরুত্বপূর্ণ: অ্যাপসেটেটিংস.জসন ফাইলটিতে ডান ক্লিক করুন -> বৈশিষ্ট্যে ক্লিক করুন -> নতুন হলে কপিটি নির্বাচন করুন: এখানে চিত্র বর্ণনা লিখুন

  1. অবশেষে, আপনি এটি করতে পারেন:

    কনফিগ [ "key1"]

আমার কনফিগারেশন ফাইলটি দেখতে এইরকম হবে:

{
    "ConnectionStrings": "myconnection string here",
    "key1": "value here"
}

2

আপনি কোড নীচে চেষ্টা করতে পারেন। এটা আমার জন্য কাজ করছে।

public class Settings
{
    private static IHttpContextAccessor _HttpContextAccessor;

    public Settings(IHttpContextAccessor httpContextAccessor)
    {
        _HttpContextAccessor = httpContextAccessor;
    }

    public static void Configure(IHttpContextAccessor httpContextAccessor)
    {
        _HttpContextAccessor = httpContextAccessor;
    }

    public static IConfigurationBuilder Getbuilder()
    {
        var builder = new ConfigurationBuilder()
          .SetBasePath(Directory.GetCurrentDirectory())
          .AddJsonFile("appsettings.json");
        return builder;
    }

    public static string GetAppSetting(string key)
    {
        //return Convert.ToString(ConfigurationManager.AppSettings[key]);
        var builder = Getbuilder();
        var GetAppStringData = builder.Build().GetValue<string>("AppSettings:" + key);
        return GetAppStringData;
    }

    public static string GetConnectionString(string key="DefaultName")
    {
        var builder = Getbuilder();
        var ConnectionString = builder.Build().GetValue<string>("ConnectionStrings:"+key);
        return ConnectionString;
    }
}

সংযোগ স্ট্রিং এবং অ্যাপ্লিকেশন সেটিংস পেতে এখানে আমি একটি শ্রেণি তৈরি করেছি।

I startup.cs ফাইলটি আপনার নীচের মত ক্লাস নিবন্ধন করতে হবে।

public class Startup
{

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        var httpContextAccessor = app.ApplicationServices.GetRequiredService<IHttpContextAccessor>();
        Settings.Configure(httpContextAccessor);
    }
}

2

এএসপি.নেট কোর 3.1 এর জন্য আপনি এই ডকুমেন্টেশনটি অনুসরণ করতে পারেন:

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-3.1

আপনি যখন একটি নতুন এএসপি.নেট কোর 3.1 প্রকল্প তৈরি করবেন তখন আপনার নিম্নলিখিত কনফিগারেশন লাইনটি থাকবে Program.cs:

Host.CreateDefaultBuilder(args)

এটি নিম্নলিখিতগুলিকে সক্ষম করে:

  1. শাইনড কনফিগারেশনপ্রোভাইডার: একটি বিদ্যমান আইকনফিগারেশনকে উত্স হিসাবে যুক্ত করে। ডিফল্ট কনফিগারেশন ক্ষেত্রে, হোস্ট কনফিগারেশন যুক্ত করে এবং অ্যাপ্লিকেশন কনফিগারেশনের প্রথম উত্স হিসাবে সেট করে।
  2. JSON কনফিগারেশন সরবরাহকারী ব্যবহার করে appsettings.json।
  3. JSON কনফিগারেশন সরবরাহকারী ব্যবহার করে অ্যাপসেটেটিং.এনভায়রন.জসন। উদাহরণস্বরূপ, অ্যাপসেটিংস.প্রডাকশন.জসন এবং অ্যাপসেটিংস.ডেভলপমেন্ট.জসন।
  4. অ্যাপ্লিকেশনটি যখন বিকাশের পরিবেশে চালিত হয় তখন অ্যাপস সিক্রেটস।
  5. এনভায়রনমেন্ট ভেরিয়েবল কনফিগারেশন সরবরাহকারী ব্যবহার করে পরিবেশের ভেরিয়েবল।
  6. কমান্ড-লাইন কনফিগারেশন সরবরাহকারী ব্যবহার করে কমান্ড-লাইন আর্গুমেন্ট।

এর অর্থ আপনি IConfigurationএকটি স্ট্রিং কী, এমনকি নেস্ট করা মান সহ মানগুলি ইনজেক্ট এবং আনতে পারেন । মতIConfiguration ["Parent:Child"];

উদাহরণ:

appsettings.json

{
  "ApplicationInsights":
    {
        "Instrumentationkey":"putrealikeyhere"
    }
}

WeatherForecast.cs

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
    private static readonly string[] Summaries = new[]
    {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

    private readonly ILogger<WeatherForecastController> _logger;
    private readonly IConfiguration _configuration;

    public WeatherForecastController(ILogger<WeatherForecastController> logger, IConfiguration configuration)
    {
        _logger = logger;
        _configuration = configuration;
    }

    [HttpGet]
    public IEnumerable<WeatherForecast> Get()
    {
        var key = _configuration["ApplicationInsights:InstrumentationKey"];

        var rng = new Random();
        return Enumerable.Range(1, 5).Select(index => new WeatherForecast
        {
            Date = DateTime.Now.AddDays(index),
            TemperatureC = rng.Next(-20, 55),
            Summary = Summaries[rng.Next(Summaries.Length)]
        })
        .ToArray();
    }
}

@ ওগ্লাস ... ওয়েদারফোরকাস্টকন্ট্রোলার () কলকারী কীভাবে আইকনফিগারেশন প্রয়োগ করে এমন ক্লাসটি পেতে পারে?
জনি উ

1

এই "প্রতারণা" ছিল? আমি কেবলমাত্র স্টার্টআপ ক্লাসের স্থিতিতে আমার কনফিগারেশন তৈরি করেছি এবং তারপরে আমি অন্য যে কোনও জায়গা থেকে এটি অ্যাক্সেস করতে পারি:

public class Startup
{
    // This method gets called by the runtime. Use this method to add services to the container.
    // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
    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)
            .AddEnvironmentVariables();

        Configuration = builder.Build();
    }

    public static IConfiguration Configuration { get; set; }

1

এটি কলের মাধ্যমে একটি বিষয় হিসাবে নিয়ামকের ভিতরে পান Get<YourType>():

public IActionResult Index([FromServices] IConfiguration config)
{
    BillModel model = config.GetSection("Yst.Requisites").Get<BillModel>();
    return View(model);
}

1

প্রথমে আপনার আইকনফিগারেশন ইনজেকশন করা উচিত এবং তারপরে অ্যাপসেটিংগুলি থেকে পড়ার জন্য, আপনি এই পদ্ধতির একটি ব্যবহার করতে পারেন:

  1. একটি বিভাগের ডেটা পান

    var redisConfig = configuration.GetSection("RedisConfig");
  2. একটি বিভাগের মধ্যে একটি মান পান

    var redisServer = configuration.GetValue<string>("RedisConfig:ServerName");
  3. বিভাগের মধ্যে নেস্টেড মান পান

    var redisExpireMInutes = configuration.GetValue<int>("RedisConfig:ServerName:ExpireMInutes");

ইনজেকশন নিয়ন্ত্রণকারীদের জন্য কাজ করে, তবে আমি যদি এখানে মিডলওয়ারে এটি ব্যবহার করতে চাই তবে কী হবে ? EG আমি রেডিসকে HTTP প্রতিক্রিয়াগুলি ক্যাশে করতে মিডওয়্যার হিসাবে ব্যবহার করছি।
আলেকজান্ডার রায়ান ব্যাগেট

1

.NET কোর 2.2 উপায়

(সন্দেহ নেই মাইক্রোসফ্ট এটিকে আবার পরবর্তী। নেট সংস্করণে একেবারে আলাদা কিছুতে পরিবর্তন করবে))

1. অ্যাপসেটেটিংস.জসন

এটি দেখতে কিছু দেখতে লাগবে। এখানে আমরা সেটিংস 1 এবং সেটিং 2 লোড করব

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",
  "Setting1": "abc",
  "Setting2": 123
}

2. অ্যাপসেটেটিংস

Poco বর্গ Setting1 এবং Setting2 রাখা। আমরা এই শ্রেণীর অবজেক্টে appsettings.json লোড করব। পোকো শ্রেণীর কাঠামোটি জেএসওএন ফাইলের সাথে মেলে, অন্য ইচ্ছামত বৈশিষ্ট্য / শ্রেণীর মধ্যে ইচ্ছামত সম্পত্তি থাকতে পারে।

public class AppSettings
{
    public string Setting1 { get; set; }
    public int Setting2 { get; set; }
}

3 স্টার্টআপ

অ্যাপসেটিংস অবজেক্টটি আপনার মধ্যে অ্যাপসেটেটিংস.জসন লোড করুন এবং এটি ব্যবহার শুরু করুন:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        AppSettings settings = new AppSettings();

        Configuration = configuration;
        configuration.Bind(settings);

        // Now start using it
        string setting1 = settings.Setting1;
        int setting2 = settings.Setting2;
    }

0

নেটকর্পাপ ৩.১ এর সর্বশেষতম পুনরাবৃত্তির সাহায্যে, আপনি কোনও তৃতীয় পক্ষের নির্ভরতা ছাড়াই খুব সহজেই এটি করতে পারেন।

আমি এর জন্য একটি বাক্য তৈরি করেছি , তবে আপনি এই ক্লাসটি একটি JSON ফাইল পড়তে এবং গতিশীল বৈশিষ্ট্যগুলি ফিরে পেতে ব্যবহার করতে পারেন।

using System.Text.Json;
using System.IO;

class ConfigurationLoader
{

    private dynamic configJsonData;
    public ConfigurationLoader Load(string configFilePath = "appsettings.json")
    {
        var appSettings = File.ReadAllText(configFilePath);
        this.configJsonData = JsonSerializer.Deserialize(appSettings, typeof(object));
        return this;
    }

    public dynamic GetProperty(string key)
    {
        var properties = key.Split(".");
        dynamic property = this.configJsonData;
        foreach (var prop in properties)
        {
            property = property.GetProperty(prop);
        }

        return property;
    }
}

আমি বিশেষত এটি তৈরি করেছি যাতে আমি আমার ডটনেট কনসোল অ্যাপ্লিকেশনটিতে একটি appconfig.json ব্যবহার করতে পারি। আমি কেবল এটি আমার Program.Mainফাংশনে রেখেছি :

var config = new ConfigurationLoader();
config.Load();
Console.WriteLine(config.GetProperty("Environment.Name"));

এবং dynamicএটি সম্পত্তির জন্য কোনও বস্তু ফিরিয়ে দেবে । (একটি জসন এলিমেন্ট যদি এটি আদিম না হয়)। আমার appsettings.jsonফাইলটি এমন দেখাচ্ছে:

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