App.config / web.config এর মধ্যে চলক


92

ফাইল app.configবা web.configফাইলগুলিতে নিম্নলিখিতগুলির মতো কিছু করা সম্ভব ?

<appSettings>
 <add key="MyBaseDir" value="C:\MyBase" />
 <add key="Dir1" value="[MyBaseDir]\Dir1"/>
 <add key="Dir2" value="[MyBaseDir]\Dir2"/>
</appSettings>

তারপরে আমি সহজভাবে এই বলে আমার কোডটিতে Dir2 অ্যাক্সেস করতে চাই:

 ConfigurationManager.AppSettings["Dir2"]

আমি যখন আমার অ্যাপ্লিকেশনটি বিভিন্ন সার্ভার এবং লোকেশনগুলিতে ইনস্টল করি তখন এটি আমাকে সহায়তা করবে যেখানে আমার সম্পূর্ণ আমার কেবল একটি এন্ট্রি পরিবর্তন করতে হবে app.config। (আমি জানি যে আমি কোডের সমস্ত উপসংহার পরিচালনা করতে পারি, তবে আমি এটি এটিকে পছন্দ করি)।


আমি মনে করি তিনি সরাসরি কনফিগারেশন ফাইলের মধ্যে অ্যাপসেটেটিং কীগুলিতে ভেরিয়েবলগুলি সংজ্ঞায়নের বিষয়ে কথা বলছেন।
মিশাল কার্পেন্টিয়ার

4
আমি এক্সএমএল <! ENTITY> ঘোষণাটি ব্যবহার করেও চেক আউট করেছি, তবে এমএস যেভাবে ওয়েবকনফাইগ ফাইলগুলি পরিচালনা করে তার কারণে এটি সমর্থিত নয়।
চিলটেম্প

আপনার প্রচেষ্টার জন্য ধন্যবাদ। আমি কোনও কোড পরিবর্তন না করা পছন্দ করি। কোডটিতে ইতিমধ্যে একটি বিবৃতি রয়েছে: স্ট্রিং ডায়ার = = কনফিগারেশন ম্যানেজ.অ্যাপসেটেটিংস ["Dir2"]। আমি কেবলমাত্র অ্যাপকনফাইগটিই পরিষ্কার করতে চাই যা এখন মান = "ডি: \ ব্লাদির \ দির 2" এর পরিবর্তে মান = "[মাইবেসডির] \ ডিরি
ডিস্ট্যাক ওভারফ্লো

উত্তর:


7

ভাল প্রশ্ন.

আমি মনে করি না সেখানে আছে। আমি বিশ্বাস করি যে যদি কোনও সহজ উপায় থাকে তবে এটি বেশ পরিচিত ছিল এবং আমি দেখতে পেয়েছি যে মাইক্রোসফ্ট ভিজ্যুয়াল স্টুডিও ২০১০ সালে মোতায়েন এবং পরীক্ষার জন্য বিভিন্ন কনফিগারেশন ফাইল স্থাপনের জন্য একটি প্রক্রিয়া তৈরি করছে।

যদিও তা বলেছে; আমি খুঁজে পেয়েছি যে ConnectionStringsবিভাগে আপনার কাছে "| ডেটা ডিরেক্টরী |" নামে পরিচিত একধরণের স্থানধারক রয়েছে। সেখানে আপনি কী কাজ করছেন তা একবার দেখে নিতে পারেন ...

machine.configএটি দেখানো থেকে এখানে একটি টুকরা :

 <connectionStrings>
    <add
        name="LocalSqlServer"
        connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true"
        providerName="System.Data.SqlClient"
    />
 </connectionStrings>

এটি আকর্ষণীয় তথ্য। পাইপ প্রতীক ("|") ব্যবহার করে ভেরিয়েবল অ্যাক্সেস করা যেতে পারে? হুম .. আমি অবাক হয়েছি এটি যদি কাজ করে: <যোগ কী = "ডিরি 2" মান = "| মাইবেসডির | \ দির 2" />
ডিস্ট্যাক ওভারফ্লো

4
ডেটাডাইরেক্টরি মানটি আসলে অ্যাপডোমাইনে একটি ডেটা উপাদান। আপনি অ্যাপডোমাইন.কন্টেনডোমাইন.সেটডাটা ("ডেটা ডিরেক্টরী", ডেটাপথ) ব্যবহার করে মানটিকে ওভাররাইড করতে পারেন; আপনি যদি এইরকম অন্যান্য ভেরিয়েবলগুলি সংজ্ঞায়িত করতে পারেন এবং সেগুলিকে "অটোপেক্স" করাতে পারেন তবে আমি পরীক্ষা করে দেখিনি ...
পিটার লিলভোল্ড

22

কিছুটা জটিল, তবে আরও নমনীয়, বিকল্প হ'ল এমন একটি ক্লাস তৈরি করা যা একটি কনফিগারেশন বিভাগকে উপস্থাপন করে। আপনার app.config/ web.configফাইলে, আপনি এটি থাকতে পারেন:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <!-- This section must be the first section within the <configuration> node -->
    <configSections>
        <section name="DirectoryInfo" type="MyProjectNamespace.DirectoryInfoConfigSection, MyProjectAssemblyName" />
    </configSections>

    <DirectoryInfo>
        <Directory MyBaseDir="C:\MyBase" Dir1="Dir1" Dir2="Dir2" />
    </DirectoryInfo>
</configuration>

তারপরে, আপনার নেট নেটওয়ার্কে (আমি আমার উদাহরণে সি # ব্যবহার করব), আপনি দুটি শ্রেণি তৈরি করতে পারেন:

using System;
using System.Configuration;

namespace MyProjectNamespace {

    public class DirectoryInfoConfigSection : ConfigurationSection {

        [ConfigurationProperty("Directory")]
        public DirectoryConfigElement Directory {
            get {
                return (DirectoryConfigElement)base["Directory"];
            }
    }

    public class DirectoryConfigElement : ConfigurationElement {

        [ConfigurationProperty("MyBaseDir")]
        public String BaseDirectory {
            get {
                return (String)base["MyBaseDir"];
            }
        }

        [ConfigurationProperty("Dir1")]
        public String Directory1 {
            get {
                return (String)base["Dir1"];
            }
        }

        [ConfigurationProperty("Dir2")]
        public String Directory2 {
            get {
                return (String)base["Dir2"];
            }
        }
        // You can make custom properties to combine your directory names.
        public String Directory1Resolved {
            get {
                return System.IO.Path.Combine(BaseDirectory, Directory1);
            }
        }
    }
}

শেষ পর্যন্ত, আপনার প্রোগ্রামের কোডটিতে, আপনি app.configএইভাবে আপনার নতুন ক্লাসগুলি ব্যবহার করে আপনার ভেরিয়েবলগুলি অ্যাক্সেস করতে পারেন :

DirectoryInfoConfigSection config =
  (DirectoryInfoConfigSection)ConfigurationManager.GetSection("DirectoryInfo");
String dir1Path = config.Directory.Directory1Resolved;  // This value will equal "C:\MyBase\Dir1"

4
ধন্যবাদ তবে আমি কোনও কোড পরিবর্তন না করে এটি করার চেষ্টা করছি কারণ এটি এই পর্যায়ে ব্যথা।
ডিস্ট্যাক ওভারফ্লো

কোডের শেষ লাইনে একটি ছোট ত্রুটি রয়েছে (ধনুর্বন্ধনী গণনা করছে না): "রিটার্ন সিস্টেম.আইও.প্যাথ.কোমাইন (মাইবেসডির, ডিআর 1);" পরিবর্তে "রিটার্ন সিস্টেম.আইও.প্যাথ.কোমাইন (বেসডাইরেক্টরি, ডিআর 1)" হওয়া উচিত; অথবা অন্যথায় পদ্ধতিটির নাম 'বেস ডিরেক্টরি' থেকে 'মাইবেসডির' করা যেতে পারে
TheWho

16

আপনি আমার লাইব্রেরি এক্সপেনসিভ ব্যবহার করে সম্পন্ন করতে পারেন । এখানে নুগেটেও উপলব্ধ ।

এটি একটি প্রাথমিক ব্যবহারের ক্ষেত্রে হিসাবে এটি ডিজাইন করা হয়েছিল।

পরিমিত উদাহরণ (টোকেন প্রসারণের জন্য ডিফল্ট উত্স হিসাবে অ্যাপসেটিংগুলি ব্যবহার করে)

App.config এ:

<configuration>
    <appSettings>
        <add key="Domain" value="mycompany.com"/>
        <add key="ServerName" value="db01.{Domain}"/>
    </appSettings>
    <connectionStrings>
        <add name="Default" connectionString="server={ServerName};uid=uid;pwd=pwd;Initial Catalog=master;" provider="System.Data.SqlClient" />
    </connectionStrings>
</configuration>

ব্যবহার করুন .Expand () স্ট্রিং উপর এক্সটেনশন পদ্ধতি সম্প্রসারিত হবে:

var connectionString = ConfigurationManager.ConnectionStrings["Default"].ConnectionString;
connectionString.Expand() // returns "server=db01.mycompany.com;uid=uid;pwd=pwd;Initial Catalog=master;"

বা

ডায়নামিক কনফিগারেশন ম্যানেজার মোড়ক "কনফিগারেশন" নীচের হিসাবে ব্যবহার করুন (প্রসারিত করার জন্য স্পষ্ট কল) (প্রয়োজনীয় নয়):

var serverName = Config.AppSettings.ServerName;
// returns "db01.mycompany.com"

var connectionString = Config.ConnectionStrings.Default;
// returns "server=db01.mycompany.com;uid=uid;pwd=pwd;Initial Catalog=master;"

উন্নত উদাহরণ 1 (টোকেন প্রসারণের জন্য ডিফল্ট উত্স হিসাবে অ্যাপসেটিংগুলি ব্যবহার করে)

App.config এ:

<configuration>
    <appSettings>
        <add key="Environment" value="dev"/>
        <add key="Domain" value="mycompany.com"/>
        <add key="UserId" value="uid"/>
        <add key="Password" value="pwd"/>
        <add key="ServerName" value="db01-{Environment}.{Domain}"/>
        <add key="ReportPath" value="\\{ServerName}\SomeFileShare"/>
    </appSettings>
    <connectionStrings>
        <add name="Default" connectionString="server={ServerName};uid={UserId};pwd={Password};Initial Catalog=master;" provider="System.Data.SqlClient" />
    </connectionStrings>
</configuration>

প্রসারিত করার জন্য স্ট্রিংয়ে .Exand () এক্সটেনশন পদ্ধতিটি ব্যবহার করুন:

var connectionString = ConfigurationManager.ConnectionStrings["Default"].ConnectionString;
connectionString.Expand() // returns "server=db01-dev.mycompany.com;uid=uid;pwd=pwd;Initial Catalog=master;"

4
আমি মনে করি এই উত্তরটি খুব রেট দেওয়া হয়েছে !!
আহমাদ

ধন্যবাদ আহমদ! আপনি কীভাবে বিস্তৃতি চান তা আমাকে জানান।
অ্যান্ডলি

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

আপনার গ্রন্থাগারটি কীভাবে এটি সম্পাদন করতে ব্যবহৃত হতে পারে তার একটি সংক্ষিপ্ত উদাহরণ প্রদান করতে পারেন?
রায়ান গেটস

অন্য যে কারও জন্য এখন কেবল এটিকে হোঁচট খাচ্ছে, ২০১১ সাল থেকে এই প্রকল্পটি এখন 6 বছরের জন্য মারা গেছে :(
ব্যবহারকারী 1003916

4

আমি ভেবেছিলাম আমি এই প্রশ্নটি দেখেছি।

সংক্ষেপে, না, কোনও অ্যাপ্লিকেশন কনফিগারেশনের মধ্যে কোনও ভেরিয়েবল ইন্টারপোলেশন নেই।

আপনার কাছে দুটি বিকল্প রয়েছে

  1. রানটাইমে আপনি ভেরিয়েবলগুলি বিকল্পের জন্য নিজস্ব রোল করতে পারেন
  2. নির্মাণের সময়, অ্যাপ্লিকেশন কনফিগারেশনটিকে লক্ষ্য স্থাপনার পরিবেশের নির্দিষ্ট নির্দিষ্ট ক্ষেত্রে ম্যাসেজ করুন। কনফিগারেশন-দুঃস্বপ্নের সাথে ডিল করার ক্ষেত্রে এ সম্পর্কে কিছু বিশদ

এটি সঠিক পোস্ট। আমার আগের পোস্ট (একই প্রশ্ন) অ্যাপ.config এক্সএমএল প্রবেশের উদাহরণ দেখায় নি। আমি আপনার লিঙ্কটি যাচাই করেছি - এটি খুব বেশি কাজ এবং সেখানে সময় না কাটাতে পছন্দ করে different আমাদের কাছে বিভিন্ন বাক্সের জন্য আলাদা অ্যাপ্লিকেশন রয়েছে i এবং আমি সে থেকে দূরে যেতে চাই।
ডিইস্ট্যাক ওভারফ্লো

3

আপনার কাছে কয়েকটি বিকল্প রয়েছে। আপনি বিল্ড / মোতায়েন পদক্ষেপের সাহায্যে এটি করতে পারেন যা আপনার ভেরিয়েবলগুলি সঠিক মানের সাথে প্রতিস্থাপন করে আপনার কনফিগারেশন ফাইলটি প্রক্রিয়া করবে।

অন্য বিকল্পটি হ'ল আপনার নিজস্ব কনফিগারেশন বিভাগটি সংজ্ঞায়িত করা যা এটি সমর্থন করে। উদাহরণস্বরূপ এই এক্সএমএল কল্পনা করুন:

<variableAppSettings>
 <variables>
    <add key="@BaseDir" value="c:\Programs\Widget"/>
 </variables>
 <appSettings>
    <add key="PathToDir" value="@BaseDir\Dir1"/>
 </appSettings>
</variableAppSettings>

এখন আপনি এটি কাস্টম কনফিগারেশন অবজেক্টগুলি ব্যবহার করে প্রয়োগ করবেন যা রানটাইমের সময় আপনার জন্য ভেরিয়েবলগুলি প্রতিস্থাপন করবে।


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

কাস্টম কনফিগারেশন অবশ্যই স্পষ্টভাবে [সহজ] কোডিং জড়িত। তবে আইএমএইচও এটি সর্বদা আপনার সেরা বিকল্প। আমি প্রায় প্রতিটি অ্যাপ্লিকেশন ব্যবহার করি না, পরিবর্তে প্রতিটি প্রকল্পের জন্য একটি কাস্টম কনফিগারেশন তৈরি করতে পছন্দ করি prefer
পোর্টম্যান 17

3

সাধারণত, আমি আমার ওয়েবকনফাইগের প্রতিটি সেটিংস অ্যাক্সেস করার জন্য বৈশিষ্ট্য সহ একটি স্ট্যাটিক ক্লাস লিখি।

public static class ConfigManager 
{
    public static string MyBaseDir
    {
        return ConfigurationManager.AppSettings["MyBaseDir"].toString();
    }

    public static string Dir1
    {
        return MyBaseDir + ConfigurationManager.AppSettings["Dir1"].toString();
    }

}

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

সাধারণত, এই শ্রেণীর সাথে সেটিংস প্রতিস্থাপন করা তুলনামূলকভাবে সহজ এবং অনেক বেশি রক্ষণাবেক্ষণের ব্যবস্থা করে।


3

আপনি app.configযে দৃশ্যের বর্ণনা দিয়েছেন তার জন্য আপনি আপনার পরিবেশের পরিবর্তনশীলগুলি ব্যবহার করতে পারেন

<configuration>
  <appSettings>
    <add key="Dir1" value="%MyBaseDir%\Dir1"/>
  </appSettings>
</configuration>

তাহলে আপনি সহজেই এর সাথে পাথটি পেতে পারবেন:

var pathFromConfig = ConfigurationManager.AppSettings["Dir1"];
var expandedPath = Environment.ExpandEnvironmentVariables(pathFromConfig);

2

ভিতরে <appSettings>আপনি অ্যাপ্লিকেশন কী তৈরি করতে পারেন,

<add key="KeyName" value="Keyvalue"/>

পরে আপনি এই মানগুলি ব্যবহার করে অ্যাক্সেস করতে পারেন:

ConfigurationManager.AppSettings["Keyname"]

ConfigurationManager বর্গ আপনি প্রয়োজন ব্যবহার করার জন্য System.Configuration একটি রেফারেন্স যোগ এবং (ভিবি মধ্যে আমদানি) System.Configuration জন্য একটি বিবৃতি ব্যবহার যোগ করার জন্য
CJK

4
ইঙ্গিতটি সঠিক তবে জিজ্ঞাসিত প্রশ্নের উত্তর নয়।
মিশাল কার্পেন্টিয়ার

1

আমি আপনাকে DslConfig পরামর্শ দিতে হবে । DslConfig এর সাহায্যে আপনি প্রতিটি সার্ভার হোস্টে অ্যাপ্লিকেশন কনফিগার করতে গ্লোবাল কনফিগারেশন, সার্ভার হোস্ট কনফিগারেশন থেকে হাইয়ারার্কিকাল কনফিগারেশন ফাইলগুলি ব্যবহার করতে পারেন (অ্যাপস্পাইকটি দেখুন)।
এটি যদি আপনার পক্ষে জটিল হয় তবে আপনি কেবল বৈশ্বিক কনফিগারেশন ভেরিয়েবলস.ওয়ার ব্যবহার করতে পারেন কেবলমাত্র
ভারিবেলেস.ভারে কনফিগার করুন

baseDir = "C:\MyBase"
Var["MyBaseDir"] = baseDir
Var["Dir1"] = baseDir + "\Dir1"
Var["Dir2"] = baseDir + "\Dir2"

এবং এর সাথে কনফিগার মানগুলি পান

Configuration config = new DslConfig.BooDslConfiguration()
config.GetVariable<string>("MyBaseDir")
config.GetVariable<string>("Dir1")
config.GetVariable<string>("Dir2")

0

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


0

আপনি যা চান তা নিয়ে আমি কিছুটা লড়াই করছি, তবে আপনি অ্যাপ সেটিংসে একটি ওভাররাইড ফাইল যুক্ত করতে পারেন তারপরে সেই পরিবেশের ভিত্তিতে ওভাররাইড ফাইল সেট করতে পারেন।

<appSettings file="..\OverrideSettings.config">

0

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


0

আমি ম্যাট হ্যামস্মিথের সমাধান অনুসরণ করার সুপারিশ করব। যদি এটি কার্যকর করার সমস্যা হয়, তবে কেন অ্যাপসেটেটিং ক্লাসে ব্যাকগ্রাউন্ডে এটি প্রয়োগ করে এমন একটি এক্সটেনশন পদ্ধতি তৈরি করবেন না?

কিছুটা এইরকম:

    public static string GetValue(this NameValueCollection settings, string key)
    {

    }

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

<appSettings>
  <DirectoryMappings>
    <DirectoryMap key="MyBaseDir" value="C:\MyBase" />
    <DirectoryMap key="Dir1" value="[MyBaseDir]\Dir1"/>
    <DirectoryMap key="Dir2" value="[MyBaseDir]\Dir2"/>
  </DirectoryMappings>
</appSettings>

0

আমি এই সমাধানটি নিয়ে এসেছি:

  1. অ্যাপ্লিকেশন সেটিংস.সেটেটিংগুলিতে আমি একটি পরিবর্তনশীল কনফিগারেশনবেস সংজ্ঞায়িত করেছি (টাইপ = স্ট্রিং এর ব্যাপ্তি = প্রয়োগের সাথে)
  2. আমি সেটিংস.সেটেটিংগুলিতে টার্গেট অ্যাট্রিবিউটে একটি পরিবর্তনশীল প্রবর্তন করেছি, এই সমস্ত বৈশিষ্ট্যগুলি স্কোপ = ব্যবহারকারীতে সেট করতে হয়েছিল
  3. App.xaml.cs এ আমি কনফিগারেশনবেস মানটি পড়েছি
  4. App.xaml.cs এ আমি কনফিগারেশনবেস মান দিয়ে সমস্ত ভেরিয়েবল প্রতিস্থাপন করেছি। রান-টাইমে মানগুলি প্রতিস্থাপনের জন্য বৈশিষ্ট্যগুলি Scopr = ব্যবহারকারীর উপর সেট করতে হয়েছিল

আমি এই সমাধানটির সাথে সত্যই সন্তুষ্ট নই কারণ আমাকে সমস্ত বৈশিষ্ট্য ম্যানুয়ালি বদলাতে হবে, যদি আমি কোনও নতুন যুক্ত করি তবে এটি এপ্স.এক্সএএমএল.সিএস-এ বিবেচনা করতে হবে।

এখানে App.xaml.cs এর একটি কোড স্নিপেট:

string configBase = Settings.Default.ConfigurationBase;
Settings.Default.CommonOutput_Directory = Settings.Default.CommonOutput_Directory.Replace("${ConfigurationBase}", configBase);

হালনাগাদ

সবেমাত্র একটি উন্নতি পাওয়া গেছে (অ্যাপ্লিকেশন থেকে আবার একটি কোড স্নিপেট। Xaml.cs):

string configBase = Settings.Default.ConfigurationBase;

foreach (SettingsProperty settingsProperty in Settings.Default.Properties)
{
    if (!settingsProperty.IsReadOnly && settings.Default[settingsProperty.Name] is string)
    {
        Settings.Default[settingsProperty.Name] = ((string)Settings.Default[settingsProperty.Name]).Replace("${ConfigurationBase}", configBase);
    }
}

এখন প্রতিস্থাপনগুলি আমার সেটিংসে সমস্ত বৈশিষ্ট্যের জন্য কাজ করে যা টাইপ = স্ট্রিং এবং স্কোপ = ব্যবহারকারী। আমি মনে করি এটি আমার পছন্দ হয়েছে।

আপডেট 2

স্পষ্টতই স্কোপ সেট করা = বৈশিষ্ট্যগুলি চালনার সময় অ্যাপ্লিকেশনটির প্রয়োজন হয় না।


0

তিনটি সম্ভাব্য সমাধান

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

এই উদাহরণের জন্য আমি কনসোল অ্যাপ্লিকেশনটিতে নিম্নলিখিত অ্যাপ্লিকেশন সেটিংসটি ব্যবহার করেছি:

<appSettings>
    <add key="EnvironmentVariableExample" value="%BaseDir%\bin"/>
    <add key="StaticClassExample" value="bin"/>
    <add key="InterpollationExample" value="{0}bin"/>
  </appSettings>

1. পরিবেশ পরিবর্তনশীল ব্যবহার করুন

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

  • প্রাক-বিল্ড ইভেন্ট তৈরি করুন যা এমএসবিল্ড ভেরিয়েবলগুলি ব্যবহার করবে

    সতর্কতা: একটি ভেরিয়েবল ব্যবহার করুন যা সহজেই প্রতিস্থাপন করা হবে না তাই আপনার প্রকল্পের নাম বা ভেরিয়েবলের নামের অনুরূপ কিছু ব্যবহার করুন।

    SETX BaseDir "$(ProjectDir)"

  • পরিবর্তনশীল পুনরায় সেট করুন; নিম্নলিখিত মত কিছু ব্যবহার:

    স্ট্যাক ওভারফ্লোতে পরিবেশের পরিবর্তনগুলি রিফ্রেশ করুন

  • আপনার কোডটিতে সেটিংটি ব্যবহার করুন:

'

private void Test_Environment_Variables()
{
    string BaseDir = ConfigurationManager.AppSettings["EnvironmentVariableExample"];
    string ExpandedPath = Environment.ExpandEnvironmentVariables(BaseDir).Replace("\"", ""); //The function addes a " at the end of the variable
    Console.WriteLine($"From within the C# Console Application {ExpandedPath}");
}

'

২. স্ট্রিং ইন্টারপোলেশন ব্যবহার করুন:

  • স্ট্রিং.ফর্ম্যাট () ফাংশনটি ব্যবহার করুন

`

private void Test_Interpollation()
{
    string ConfigPath = ConfigurationManager.AppSettings["InterpollationExample"];
    string SolutionPath = Path.GetFullPath(Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, @"..\..\"));
    string ExpandedPath = string.Format(ConfigPath, SolutionPath.ToString());
    Console.WriteLine($"Using old interpollation {ExpandedPath}");
}

`

৩. স্ট্যাটিক ক্লাস ব্যবহার করা, এটি বেশিরভাগ ক্ষেত্রেই আমি সমাধান করি।

  • রুপায়ণ

`

private void Test_Static_Class()
{
    Console.WriteLine($"Using a static config class {Configuration.BinPath}");
}

`

  • স্থির শ্রেণি

`

static class Configuration
{
    public static string BinPath
    {
        get
        {
            string ConfigPath = ConfigurationManager.AppSettings["StaticClassExample"];
            string SolutionPath = Path.GetFullPath(Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, @"..\..\"));
            return SolutionPath + ConfigPath;
        }
    }
}

`

প্রকল্পের কোড:

App.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
    </startup>
  <appSettings>
    <add key="EnvironmentVariableExample" value="%BaseDir%\bin"/>
    <add key="StaticClassExample" value="bin"/>
    <add key="InterpollationExample" value="{0}bin"/>
  </appSettings>
</configuration>

প্রোগ্রাম.সি

using System;
using System.Configuration;
using System.IO;

namespace ConfigInterpollation
{
    class Program
    {
        static void Main(string[] args)
        {
            new Console_Tests().Run_Tests();
            Console.WriteLine("Press enter to exit");
            Console.ReadLine();
        }        
    }

    internal class Console_Tests
    {
        public void Run_Tests()
        {
            Test_Environment_Variables();
            Test_Interpollation();
            Test_Static_Class();
        }
        private void Test_Environment_Variables()
        {
            string ConfigPath = ConfigurationManager.AppSettings["EnvironmentVariableExample"];
            string ExpandedPath = Environment.ExpandEnvironmentVariables(ConfigPath).Replace("\"", "");
            Console.WriteLine($"Using environment variables {ExpandedPath}");
        }

        private void Test_Interpollation()
        {
            string ConfigPath = ConfigurationManager.AppSettings["InterpollationExample"];
            string SolutionPath = Path.GetFullPath(Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, @"..\..\"));
            string ExpandedPath = string.Format(ConfigPath, SolutionPath.ToString());
            Console.WriteLine($"Using interpollation {ExpandedPath}");
        }

        private void Test_Static_Class()
        {
            Console.WriteLine($"Using a static config class {Configuration.BinPath}");
        }
    }

    static class Configuration
    {
        public static string BinPath
        {
            get
            {
                string ConfigPath = ConfigurationManager.AppSettings["StaticClassExample"];
                string SolutionPath = Path.GetFullPath(Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, @"..\..\"));
                return SolutionPath + ConfigPath;
            }
        }
    }
}

প্রাক-বিল্ড ইভেন্ট:

প্রকল্পের সেটিংস -> ইভেন্টগুলি তৈরি করুন

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