আমি কীভাবে এএসপি.নেট কোরের কোনও শ্রেণিতে কনফিগারেশন অ্যাক্সেস করব?


127

আমি এএসপি.নেট কোরের কনফিগারেশন ডকুমেন্টেশনটি পেরিয়েছি। ডকুমেন্টেশন বলছে আপনি আবেদনের যে কোনও জায়গা থেকে কনফিগারেশন অ্যাক্সেস করতে পারবেন।

নীচে টেমপ্লেট দ্বারা তৈরি করা হয়েছে স্টার্টআপ

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আমরা সমস্ত সেটিংস কনফিগার করে, স্টার্টআপ.স এর একটি সম্পত্তিও রয়েছেConfiguration

আমি কীভাবে বুঝতে পারি না আপনি কীভাবে নিয়ন্ত্রণকারীর বা অ্যাপ্লিকেশনের যে কোনও জায়গায় এই কনফিগারেশনটি অ্যাক্সেস করবেন? এমএস অপশন প্যাটার্ন ব্যবহার করার পরামর্শ দিচ্ছে তবে আমার কাছে কেবল 4-5 কী-মান জোড়া রয়েছে তাই আমি বিকল্প প্যাটার্নটি ব্যবহার না করতে চাই। আমি কেবল অ্যাপ্লিকেশনটিতে কনফিগারেশনের অ্যাক্সেস পেতে চেয়েছি। আমি এটি কোনও ক্লাসে কীভাবে ইনজেক্ট করব?


1
যদি এটি 4-5 কী মানের জোড় হয় তবে আপনি কেবল সেই স্বতন্ত্র সেটিংসটি ইনজেক্ট করতে পারেন। আমি সেই পদ্ধতির বা পরীক্ষার যোগ্যতার জন্য বিকল্পগুলির প্যাটার্নটি সুপারিশ করব। : সমস্ত তিনটি পদ্ধতির (এক আপনি মূলত সম্পর্কে জিজ্ঞাসা সহ) নিম্নলিখিত সম্ভাব্য প্রতিলিপির প্রশ্নে উত্তর হিসাবে তালিকাভুক্ত করা হয় stackoverflow.com/questions/30263681/...
stephen.vakil

কোথাও থেকে অভিধান হিসাবে কনফিগারেশন অ্যাক্সেস করতে, এই উত্তরটি দেখুন
আম্রো

সম্পূর্ণ কোড উদাহরণের জন্য এখানে চেক করুন
আরঘ্যা সি

আপনি যদি এখানে এসে থাকেন কারণ আপনি ফ্রেমওয়ার্ক কনফিগারেশনকে সিআরই কনফিগারেশনে রূপান্তর করতে স্ট্রাগল করছেন, এই উত্তরটি আপনার জন্য stackoverflow.com/a/56498687/1704458
টিএস

উত্তর:


147

হালনাগাদ

এএসপি.নেট কোর 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
   }
}

4
মোলেরেনা .... এবং কীভাবে আপনি সমাধানে একটি পৃথক শ্রেণির গ্রন্থাগার প্রকল্পের কনফিগারেশনটি ইনজেক্ট করতে চান? এই প্রাইভেট স্ট্যাটিক আইকনফাইগ্রেশন _ কনফিগারেশন- এর মত চেষ্টা করা হয়েছে {পান; সেট; ; সর্বজনীন ডেটাবেসহেলপার্স (আইকনফাইগ্রেশন কনফিগারেশন) con _ কনফিগারেশন = কনফিগারেশন; } তবে কনফিগারেশন সর্বদা নালার ... এটি কখনও কনট্রাস্ট্রারে আঘাত হানে না
ডিনোটম

2
বলেছিল, IConfigurationএরকম পাশ কাটিয়ে যাওয়া খুব ফুটো হয়ে যায়। বিকল্প প্যাটার্ন ব্যবহার করা আরও ভাল ।
মার্ক এল।

7
কাস্টম ক্লাসে সরাসরি "appsettings.json" থেকে মানগুলি কীভাবে অ্যাক্সেস করবেন? কোনও নিয়ামক থেকে ডেটা পাস না করে? এটা কি সম্ভব?
তাদেজ

2
@ হেনকমোল্লেমা আপনি কি এখানে এর উদাহরণ যুক্ত করতে পারেন? আমি এটি কোনও শ্রেণিতে কীভাবে ইনজেক্ট করব (কোথা থেকে?)।
তাদেজ

5
@ হেনকমোল্লেমা প্রশ্নটি ছিল যে কীভাবে কোনও ক্লাসে ইনজেক্ট করবেন ... "নির্ভরতা ইনজেকশনের মাধ্যমে সমাধান করা কোনও শ্রেণি" কীভাবে ইনজেক্ট করবেন না। আমি মনে করি এটিই সেখানে ভুল যোগাযোগ রয়েছে ... তার ক্লাসটি সম্ভবত এমন কোনও শৃঙ্খলা থেকে কল করা হবে না যা কোনও নিয়ামক বা স্বয়ংক্রিয় ডিআই প্রক্রিয়া দ্বারা স্বয়ংক্রিয়ভাবে সমাধান হওয়া অন্য অবজেক্টের সাথে শুরু হয়।
বিভেরনন

34

এটি করার সঠিক উপায়:

.NET কোর আপনি IConfigurationনিজের ক্লাস কনস্ট্রাক্টরের মধ্যে প্যারামিটার হিসাবে ইনজেক্ট করতে পারেন এবং এটি উপলব্ধ থাকবে।

public class MyClass 
{
    private IConfiguration configuration;
    public MyClass(IConfiguration configuration)
    {
        ConnectionString = new configuration.GetValue<string>("ConnectionString");
    }

এখন, আপনি যখন আপনার ক্লাসের একটি উদাহরণ তৈরি করতে চান, যেহেতু আপনার ক্লাসটি ইনজেকশন দেয় IConfiguration, আপনি কেবল এটি করতে সক্ষম হবেন না new MyClass(), কারণ এটি IConfigurationকনস্ট্রাক্টরের মধ্যে ইনজেকশনের একটি প্যারামিটার প্রয়োজন , সুতরাং, আপনার ক্লাসটি ইনজেকশন হিসাবে আপনার প্রয়োজন হবে ইনজেকশন শৃঙ্খলায় ভাল, যার অর্থ দুটি সহজ পদক্ষেপ:

যেখানে আপনি ব্যবহার করতে চান - 1) আপনার ক্লাস / স্প্যানিশ ভাষায় যোগ IConfigurationকরা, IServiceCollectionConfigureServices()পদ্ধতিStartup.cs

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আপনার প্রোগ্রামের যে কোনও জায়গায় ব্যবহার করুন।

প্রথম বিকল্পটি কেন সঠিক উপায় তা আমার মুখোমুখি হবেন না, আমি কেবল অভিজ্ঞ বিকাশকারীদের সর্বদা তাদের পথে আবর্জনার ডেটা এড়াতে দেখতে পারি এবং এটি ভালভাবেই বোঝা গেছে যে সমস্ত সময় স্মৃতিতে প্রচুর পরিমাণে ডেটা পাওয়া ভাল অভ্যাস নয়, না পারফরম্যান্স এবং না উন্নয়নের জন্য ভাল, এবং সম্ভবত এটি আপনার যা প্রয়োজন কেবল তা আপনার কাছে রাখা আরও সুরক্ষিত।


5
কনফিগারেশন ফাইলগুলির এই সমস্ত ইনজেকশন দারুণ অর্থহীন / অগোছালো বলে মনে হচ্ছে। স্থিতিশীল কনফিগারেশন শ্রেণীর ধারণা জন্য TY।
অ্যান্ড্রু

1
প্রশ্নটি অবশ্যই কোনও ক্লাসে কনফিগারেশন অ্যাক্সেস সম্পর্কে ছিল এবং কেবল নিয়ামক নয়। হীন পরিষেবাগুলির (মাইক্রোসার্ভেসিস) নতুন বিকাশের সাথে সাথে এটি সম্পর্কে চিন্তাভাবনা করা যেতে পারে, যখন মাইগ্রেশনগুলির বিষয়টি আসে তখন এটি বড় ব্যথা। এই কারণেই মাইক্রোসফ্ট System.Configurationসিওআর-এর ট্র্যাক ফিরে পেল । এখন, আপনি ভাল পুরানো সময়ের মত আপনার ভাল পুরানো app.configs অ্যাক্সেস করতে পারেন। এবং আমি এখানে নিয়ন্ত্রণকারীদের কথা বলছি না। আমরা এমন উপাদানগুলির সাথে কথা বলছি যার নিজস্ব কনফিগার রয়েছে
টিএস

এটি যে কোনও শ্রেণিতে অ্যাক্সেসের অনুমতি দেয় এবং কেবল নিয়ামক নয়, নির্ভরতা ইনজেকশন অর্জনের জন্য এটি কেবল নিয়ামকের মধ্যে আমদানি করা প্রয়োজন।
মায়ার স্পিজিটর

1
উভয়ই পদ্ধতি কাজ করে এবং প্রত্যেকের পক্ষে বা বিপক্ষে যুক্তিগুলি আমার মতে একাডেমিক। আমি উভয়ই বিভিন্ন অ্যাপ্লিকেশনের জন্য ব্যবহার করেছি ... এখন, আপনার অত্যন্ত সহজ দ্বিতীয় বিকল্পটির জন্য ধন্যবাদ। স্ট্যাটিক ক্লাস তৈরি করা ডিআই ব্যবহার করা বরং কঠিন।
আইজিঞ্জা

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

30

আমি জানি এটি পুরানো তবে আইওপশন নিদর্শনগুলি প্রয়োগ করা তুলনামূলক সহজ:

  1. কনফিগারেশনের সেটিংসের সাথে মেলে এমন পাবলিক গেট / সেট বৈশিষ্ট্যযুক্ত শ্রেণি

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

আমি নিশ্চিত না আপনি কেন এই কাজটি করবেন না।


1
শুধু রেফারেন্সের জন্য: docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/...
Gatsby

2
কাস্টম ক্লাসে সরাসরি "appsettings.json" থেকে মানগুলি কীভাবে অ্যাক্সেস করবেন?
তাদেজ

2
@JedatKinports আপনার যা দরকার Nuget নির্ভরতা যোগ করার জন্য Microsoft.Extensions.Configuration, Microsoft.Extensions.Configuration.Binderএবং Microsoft.Extensions.Configuration.Jsonএবং তারপর আপনি লোড appsettings.jsonমত ফাইল var config = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();..এবং এছাড়াও আপনি নিশ্চিত করার জন্য আছে appsettings.jsonসেট করা হয় আউটপুট ডিরেক্টরিতে কপিcopy always
LP13

7

configurationস্টার্টআপ.সিগুলিতে স্ট্যাটিক তৈরিরও একটি বিকল্প রয়েছে যাতে আপনি যা সহজেই যে কোনও জায়গায় এটি অ্যাক্সেস করতে পারেন, স্থির ভেরিয়েবলগুলি সুবিধাজনক হু!

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

internal static IConfiguration Configuration { get; private set; }

এটি Startup.Configuration.GetSection...কী ভুল হতে পারে ব্যবহার করে কনফিগারেশনটিকে যে কোনও জায়গায় অ্যাক্সেসযোগ্য করে তুলেছে ?


6

আমি এই মুহুর্তে এটি এইভাবে করছি:

// 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;
        }
    }
}

এবং তারপরে আমি এটি ব্যবহার করি যেখানে আমাকে অ্যাপসেটেটিংস.জসন ফাইল থেকে ডেটা নেওয়া দরকার:

var appSettingsJson = AppSettingsJson.GetAppSettings();
// appSettingsJson["keyName"]

3

আমি বিকল্পগুলির প্যাটার্ন নমুনাটি দেখেছি এবং এটি দেখেছি:

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;
    }
...
}

আমার ক্লাসের কনস্ট্রাক্টারে আইকনফিগেরেশন যুক্ত করার সময় আমি ডিআই এর মাধ্যমে কনফিগারেশন বিকল্পগুলি অ্যাক্সেস করতে পারি।

উদাহরণ:

public class MyClass{

    private Iconfiguration _config;

    public MyClass(Iconfiguration config){
        _config = config;
    }

    ... // access _config["myAppSetting"] anywhere in this class
}

এটি কি স্টার্টআপ.এস-তে স্পষ্টভাবে মাইক্লাসের উল্লেখ না করে কাজ করে? services.AddTransient <MyClass> ();
গডফাদার

হ্যাঁ, প্রকৃতপক্ষে, আপনি যে ক্লাসগুলির শুরুতে অন্য দিকে নয়, স্টার্টআপ। সিগুলিতে উল্লেখ করতে হবে। তবে আইকনফিগারেশন হ'ল আমি মনে করি ডিফল্টরূপে ইনজেক্টের জন্য ইতিমধ্যে উপলব্ধ।
পিটার হিমেরিক

হ্যাঁ এটা কাজ করে. আমি মন্তব্য করার পরে এটি চেষ্টা করেছি এবং কনফিগার প্রয়োগটি আইকনফাইগ্রেশনটিতে ইনজেক্ট করা হয়েছিল। যাইহোক ধন্যবাদ :)
গডফাদার

1
@ নেটফিড যেমন মেয়ের স্পিৎজার তার উত্তরে বলেছে, অবশ্যই আপনাকে মাই ক্লাস শুরু করার জন্য যুক্ত করতে হবে এবং যেখানেই আপনার প্রয়োজন সেখানে এটি ইনজেক্ট করতে হবে, তাই আপনাকে নিজেরাই মাইক্লাসের একটি নতুন উদাহরণ তৈরি করার দরকার নেই, আপনি যেখানে এটি প্রয়োজন সেখানে এটি ইনজেকশন দেবেন।
পিটার হিমেরিক

2

আমি জানি যে এটি করার বিভিন্ন উপায় থাকতে পারে, আমি কোর ৩.১ ব্যবহার করছি এবং অনুকূল / ক্লিনার বিকল্পটি খুঁজছিলাম এবং আমি এটি করে শেষ করেছি:

  1. আমার স্টার্টআপ ক্লাসটি ডিফল্ট হিসাবে
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.AddControllers();
}
  1. আমার অ্যাপসেটেটিং.জসন এটির মতো
{
  "CompanySettings": {
    "name": "Fake Co"
  }
}
  1. আমার ক্লাসটি একটি এপিআই কন্ট্রোলার, তাই প্রথমে আমি ব্যবহারের রেফারেন্স যুক্ত করেছি এবং তারপরে আইকনফিগুরেশন ইন্টারফেসটি ইনজেকশন করেছি
using Microsoft.Extensions.Configuration;

public class EmployeeController 
{
    private IConfiguration _configuration;
    public EmployeeController(IConfiguration configuration)
    {
        _configuration = configuration;
    }
}
  1. অবশেষে আমি getValue পদ্ধতিটি ব্যবহার করেছি
public async Task<IActionResult> Post([FromBody] EmployeeModel form)
{
    var companyName = configuration.GetValue<string>("CompanySettings:name");
    // companyName = "Fake Co"
}

0

8-2017 এ মাইক্রোসফ্ট System.Configuration.NET CORE v4.4 এর জন্য বেরিয়ে এসেছিল । বর্তমানে v4.5 এবং v4.6 পূর্বরূপ।

আমাদের মধ্যে যারা, নেট ফ্রেমওয়ার্ক থেকে সিওআর তে রূপান্তরের কাজ করে, তাদের পক্ষে এটি প্রয়োজনীয় is এটি বর্তমান app.configফাইলগুলি রাখতে এবং ব্যবহার করতে দেয় যা কোনও সমাবেশ থেকে অ্যাক্সেস করা যায়। এটি সম্ভবত এর বিকল্পও হতে পারে appsettings.json, যেহেতু মাইক্রোসফ্ট এটির প্রয়োজনীয়তা উপলব্ধি করেছিল। এটি এফডাব্লু তে আগের মতোই কাজ করে। একটি পার্থক্য আছে:

ওয়েব অ্যাপ্লিকেশন, [যেমন ASP.NET কোর ওয়েব এপিআই] আপনাকে ব্যবহার করতে হবে app.configএবং না জন্য আপনার web.config appSettingsবা configurationSection। আপনার ব্যবহারের প্রয়োজন হতে পারে web.configতবে কেবলমাত্র আপনি যদি আইআইএসের মাধ্যমে আপনার সাইটটি স্থাপন করেন। আপনি আইআইএস-নির্দিষ্ট সেটিংস এর মধ্যে রাখুনweb.config

আমি এটি নেটস্ট্যান্ডার্ড ২০ ডিএলএল এবং অ্যাসপ নেট কোর কোর ওয়েব এপি দিয়ে পরীক্ষা করেছি এবং এটি সব কাজ করছে।


0

এএসপি.নেট কোর-বিকল্প প্যাটার্নটি ব্যবহার করার উপায়। আমি কেবল যুক্ত করতে চাই, যদি আপনার স্টার্টআপের মধ্যে বিকল্পগুলি অ্যাক্সেস করার প্রয়োজন হয় তবে আমি এটি এইভাবে করার পরামর্শ দিচ্ছি:

CosmosDbOptions.cs:

public class CosmosDbOptions
{
    public string ConnectionString { get; set; }
}

Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    // This is how you can access the Connection String:
    var connectionString = Configuration.GetSection(nameof(CosmosDbOptions))[nameof(CosmosDbOptions.ConnectionString)];
}

সুতরাং আমার যদি কনফিগার সার্ভিসগুলিতে অ্যাক্সেস করা দরকার এমন এক ডজন কনফিগার মানগুলির সাথে আমার একটি সম্পূর্ণ সাবসেকশনটি পছন্দ হয় তবে তাদের সকলের জন্য আমার এটি করা দরকার? আইওপশনস প্যাটার্নের মাধ্যমে এটি করার অন্য কোনও উপায় নেই? আমাকে এটি একটি স্থিতিশীল এক্সটেনশন পদ্ধতিতে ইনজেকশন করা দরকার যেখানে আমি আমার ভর ট্রানজিট বাসটি কনফিগার করছি। কনফিগার সার্ভিসেস ডকস.মাইক্রোসফট
কুলদীপ

আমি এখানে কনফিগার সার্ভিসে আইওপশন ব্যবহার করি না ...
মার্টিন ব্র্যান্ডল

-3

আমাকে স্টার্টআপ দিয়ে নিজের প্যারামিটারগুলি পড়তে হবে। এটি ওয়েবহোস্ট শুরু হওয়ার আগে
সেখানে থাকতে হবে (যেমন প্যারামিটার ফাইল থেকে url / IP এবং পোর্টটি "শোনার" দরকার এবং এটি ওয়েবহোস্টে প্রয়োগ করতে হবে)। আরও, পুরো অ্যাপ্লিকেশনটিতে আমার সেটিংস সর্বজনীন দরকার ।

কিছুক্ষণ অনুসন্ধানের পরে (কোনও সম্পূর্ণ উদাহরণ খুঁজে পাওয়া যায়নি, কেবল স্নিপেটগুলি) এবং বিভিন্ন চেষ্টা-ত্রুটি করার পরে, আমি এটি একটি নিজস্ব .ini ফাইল দিয়ে "পুরানো উপায়" করার সিদ্ধান্ত নিয়েছি। সুতরাং .. আপনি যদি নিজের
ব্যবহার করতে চান নিজস্ব .ini ফাইল এবং / অথবা আপনার নিজের "ইউআরএল / আইপি শুনতে" সেট করুন এবং / অথবা সেটিংস সর্বজনীন প্রয়োজন, এটি আপনার জন্য ...

সম্পূর্ণ উদাহরণ, মূল 2.1 (এমভিসি) এর জন্য বৈধ:

একটি .ini-ফাইল তৈরি করুন - উদাহরণস্বরূপ:

[প্রারম্ভ]
url = http://172.16.1.201:22222
[প্যারামিটার]
* Dummy1 = gew7623
Dummy1 = সত্য
Dummy2 = 1

যার মাধ্যমে ডামিমিক্স কেবল স্ট্রিংয়ের চেয়ে অন্যান্য তারিখের উদাহরণ হিসাবে অন্তর্ভুক্ত থাকে (এবং "ভুল প্যারাম" কেসটি পরীক্ষা করার জন্য (নীচের কোডটি দেখুন)।

গ্লোবাল ভেরিয়েবলগুলি সঞ্চয় করতে প্রকল্পের মূলটিতে একটি কোড ফাইল যুক্ত করা হয়েছে:

namespace MatrixGuide
{
    public static class GV
    {
        // In this class all gobals are defined

        static string _cURL;
        public static string cURL // URL (IP + Port) on that the application has to listen
        {
            get { return _cURL; }
            set { _cURL = value; }
        }

        static bool _bdummy1;
        public static bool bdummy1 // 
        {
            get { return _bdummy1; }
            set { _bdummy1 = value; }
        }

        static int _idummy1;
        public static int idummy1 // 
        {
            get { return _idummy1; }
            set { _idummy1 = value; }
        }

        static bool _bFehler_Ini;
        public static bool bFehler_Ini // 
        {
            get { return _bFehler_Ini; }
            set { _bFehler_Ini = value; }
        }

        // add further  GV variables here..
    }
    // Add further classes here... 
}

প্রোগ্রামের কোডগুলিতে কোড পরিবর্তন করা হয়েছে (ক্রিয়েটওয়েবহস্টবিল্ডার () এর আগে):

namespace MatrixGuide
{
    public class Program
    {
        public static void Main(string[] args)
        {
            // Read .ini file and overtake the contend in globale
            // Do it in an try-catch to be able to react to errors
            GV.bFehler_Ini = false;
            try
            {
                var iniconfig = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddIniFile("matrixGuide.ini", optional: false, reloadOnChange: true)
                .Build();
                string cURL = iniconfig.GetValue<string>("Startup:URL");
                bool bdummy1 = iniconfig.GetValue<bool>("Parameter:Dummy1");
                int idummy2 = iniconfig.GetValue<int>("Parameter:Dummy2");
                //
                GV.cURL = cURL;
                GV.bdummy1 = bdummy1;
                GV.idummy1 = idummy2;
            }
            catch (Exception e)
            {
                GV.bFehler_Ini = true;
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("!! Fehler beim Lesen von MatrixGuide.ini !!");
                Console.WriteLine("Message:" + e.Message);
                if (!(e.InnerException != null))
                {
                    Console.WriteLine("InnerException: " + e.InnerException.ToString());
                }

                Console.ForegroundColor = ConsoleColor.White;
            }
            // End .ini file processing
            //
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>() //;
            .UseUrls(GV.cURL, "http://localhost:5000"); // set the to use URL from .ini -> no impact to IISExpress

    }
}

এই পথে:

  • আমার অ্যাপ্লিকেশন কনফিগারেশনটি অ্যাপসেটেটিংস থেকে আলাদা করা হয়েছে এবং জেএসএস যদি ভবিষ্যতে সংস্করণগুলি পরিবর্তন করে;
  • গ্লোবাল ভেরিয়েবলগুলিতে আমার সেটিংস রয়েছে
  • আমি প্রতিটি ডিভাইসের জন্য "ইউজার শোনার জন্য" সেট করতে সক্ষম হয়েছি, অ্যাপ্লিকেশনটি চালু আছে (আমার ডেভ মেশিন, ইন্ট্রনেট সার্ভার এবং ইন্টারনেট সার্ভার)
  • আমি সেটিংস নিষ্ক্রিয় করতে সক্ষম, পুরানো উপায় (সবেমাত্র একটি * সেট করুন)
  • আমি প্রতিক্রিয়া জানাতে সক্ষম হয়েছি, .ini ফাইলে যদি কিছু ভুল হয় (উদাঃ টাইপ মেলে না)
    যদি - উদাহরণস্বরূপ - একটি ভুল টাইপ সেট করা থাকে (যেমন * ডামি 1 = gew7623 ডামি 1 এর পরিবর্তে সক্রিয় করা হয় = সত্য) হোস্টটি লাল দেখায় কনসোলে তথ্য রয়েছে (ব্যতিক্রম সহ) এবং আমি অ্যাপ্লিকেশনটিতেও প্রতিক্রিয়া জানাতে সক্ষম হয়েছি (।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.