অ্যাপসেটেটিং বনাম অ্যাপ্লিকেশনসেটগুলি (। নেট অ্যাপকনফিগ / ওয়েবকনফিগ) এর প্রো এবং কনস


166

.NET উইন্ডোজ ফর্ম অ্যাপ্লিকেশন বিকাশ App.configকরার সময় আমাদের কনফিগারেশন মানগুলি সংরক্ষণ করার জন্য আমাদের সেই ট্যাগগুলির মধ্যে পছন্দ থাকে । কোনটা ভালো?

<configuration>

  <!-- Choice 1 -->
  <appSettings>
    <add key="RequestTimeoutInMilliseconds" value="10000"/>
  </appSettings>

  <!-- Choice 2 -->
  <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c5612342342" >
        <section name="Project1.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c5612342342" requirePermission="false" />
    </sectionGroup>
  </configSections>
  <applicationSettings>
    <Project1.Properties.Settings>
      <setting name="TABLEA" serializeAs="String">
        <value>TABLEA</value>
      </setting>
    </Project1.Properties.Settings>
  </applicationSettings>

</configuration>

মাইক্রোসফট উদাহরণ কোড তারা ব্যবহার সালে appSettings msdn.microsoft.com/en-us/library/... এই আমি খুঁজে বিভ্রান্তিকর :(
হান্ট

কোডটিপ্রজেক্ট / কেবি / ফাইলস / এই নিবন্ধটি খুঁজে পেয়েছে বলে মনে হচ্ছে যে অ্যাপসেটিকেশনগুলি ডাব্লু / আর এর জন্য রয়েছে অ্যাপ্লিকেশনসেটিংগুলি কেবল পঠনের জন্য।
হান্ট

আরেকটি নিবন্ধ যা প্রাসঙ্গিক স্ট্যাকওভারফ্লো.com
হান্ট

মনে রাখবেন যে এটি ওয়েবকনফাইগের ক্ষেত্রে প্রযোজ্য, তাই আমি এই প্রশ্নের সাথে ওয়েবকনফিগ ট্যাগটি যুক্ত করেছি।
ম্যাট

উত্তর:


151

মৌলিক <appSettings>সাথে মোকাবিলা করা সহজ - একটি মাত্র চড় <add key="...." value="..." />এন্ট্রি এবং আপনার কাজ সম্পন্ন হয়।

নেতিবাচক দিকটি হ'ল: কোনও টাইপ-চেকিং নেই, উদাহরণস্বরূপ আপনি নিজের নম্বরটি নিরাপদে ধরে নিতে পারবেন না যে আপনি কনফিগার করতে চেয়েছিলেন সেখানে আসলেই একটি সংখ্যা রয়েছে - কেউ সেই সেটিংটিতে একটি স্ট্রিং ফেলতে পারে ..... আপনি কেবল এটিকে অ্যাক্সেস করুন ConfigurationManager["(key)"]এবং তারপরে এটি শেষ আপনি কি নিয়ে কাজ করছেন তা জানার জন্য।

এছাড়াও, সময়ের সাথে সাথে, <appSettings>পরিবর্তে বিশৃঙ্খলাবদ্ধ এবং অগোছালো হয়ে উঠতে পারে, যদি আপনার অ্যাপ্লিকেশনটির অনেকগুলি অংশ সেখানে স্টাফ করা শুরু করে (পুরানো উইন্ডোজআইআই ফাইলটি মনে রাখবেন? :-))।

আপনি যদি পারেন তবে আমি নিজের নিজস্ব কনফিগারেশন বিভাগগুলি ব্যবহার করতে পছন্দ করব এবং সুপারিশ করব - .NET 2.0 দিয়ে, এটি সত্যিই বেশ সহজ হয়ে গেছে, এইভাবে আপনি পারেন:

  • ক) কোডটিতে আপনার কনফিগারেশন সেটিংস সংজ্ঞায়িত করুন এবং সেগুলি টাইপ-সেফ এবং চেক করে নিন
  • খ) আপনাকে পরিচ্ছন্নভাবে আলাদা করতে পারেন আপনার বাকিদের থেকে সেটিংস। এবং আপনি আপনার কনফিগার কোডটিও পুনরায় ব্যবহার করতে পারেন!

কোডপ্রজেক্টে .NET 2.0 কনফিগারেশন সিস্টেমটিকে অসমাপ্ত করার জন্য আপনার কাছে সত্যিই ভাল নিবন্ধগুলির একটি সিরিজ রয়েছে:

  1. .NET 2.0 কনফিগারেশনের রহস্য উন্মোচন করা হচ্ছে

  2. .NET 2.0 কনফিগারেশনের রহস্যগুলি ডিকোডিং

  3. .NET 2.0 কনফিগারেশনের রহস্যগুলি ক্র্যাক করা

অত্যন্ত বাঞ্ছনীয়! জোন রিস্তা .NET 2.0 তে কনফিগারেশন সিস্টেমটি ব্যাখ্যা করার জন্য দুর্দান্ত কাজ করেছিলেন।


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

20

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

এটি .NET 2.0 থেকে এর পরে উপলব্ধ এবং এটি করার অন্যান্য উপায় (যতদূর আমি বলতে পারি) হ্রাস করে।

আরও বিশদটি এখানে দেওয়া হয়েছে: এমএসডিএন.মাইক্রোসফটকম /en-us/library/k4s6c3a0.aspx


14

আমি এমন একটি প্যাটার্ন ব্যবহার করছি যা কিছুক্ষণ আগে পেয়েছি যেখানে আপনি বুনিয়াদি এক্সএমএল ট্যাগ ব্যবহার করেন তবে একটি স্ট্যাটিক কনফিগার ক্লাসে সেটিংস মোড়ানো। সুতরাং - একটি DIY অ্যাপ.সেটিংস।

ডটনেটপর্লস স্ট্যাটিক কনফিগার প্যাটার্ন

আপনি যদি এভাবে করেন তবে আপনি এটি করতে পারেন:

  • বিভিন্ন পরিবেশের জন্য কনফিগার মানগুলির বিভিন্ন সেট ব্যবহার করুন (দেব, পরীক্ষা, প্রোড)
  • প্রতিটি সেটিংয়ের জন্য বুদ্ধিমান ডিফল্ট সরবরাহ করুন
  • মানগুলি কীভাবে সংজ্ঞায়িত ও তাত্ক্ষণিক হয় তা নিয়ন্ত্রণ করুন

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

কনফিগ:

<add key="machineName" value="Prod" />
<add key="anotherMachineName" value="Test" />
<add key="EnvTypeDefault" value="Dev" />

<add key="RootURLProd" value="http://domain.com/app/" />
<add key="RootURLTest" value="http://test.domain.com/app/" />
<add key="RootURLDev" value="http://localhost/app/" />

<add key="HumanReadableEnvTypeProd" value="" />
<add key="HumanReadableEnvTypeTest" value="Test Mode" />
<add key="HumanReadableEnvTypeDev" value="Development Mode" />

কনফিগার ক্লাস:

using System;
using System.Collections.Generic;
using System.Web;
using WebConfig = System.Web.Configuration.WebConfigurationManager;

    public static class Config
    {
        #region Properties

        public static string EnvironmentType { get; private set; }

        public static Uri RootURL { get; private set; }

        public static string HumanReadableEnvType { get; private set; }

        #endregion

        #region CTOR

        /// <summary>
        /// Initializes all settings when the app spins up
        /// </summary>
        static Config()
        {
            // Init all settings here to prevent repeated NameValueCollection lookups
            // Can increase performance on high volume apps

            EnvironmentType =
                WebConfig.AppSettings[System.Environment.MachineName] ??
                "Dev";

            RootURL =
                new Uri(WebConfig.AppSettings["RootURL" + EnvironmentType]);

            HumanReadableEnvType =
                WebConfig.AppSettings["HumanReadableEnvType" + Config.EnvironmentType] ??
                string.Empty;
        }

        #endregion
    }

11

বোঝার জন্য অনুকূল এবং কনস মধ্যে সেটিংস app.config, আমি পরামর্শ অনুযায়ী আপনি উভয় প্রযুক্তিগত বিস্তারিত মধ্যে দেখুন। আমি লিঙ্কগুলি অন্তর্ভুক্ত করেছি যেখানে নীচে আরও প্রযুক্তিগত বিবরণ বর্ণনা করে আপনি পরিচালনা করার জন্য উত্স কোডটি পেতে পারেন can

আমি তাদের সাথে কাজ করার সময় আমি কী স্বীকৃত হয়েছিল তার সংক্ষেপে সংক্ষেপে বলতে পারি ( দ্রষ্টব্য:web.config কোনও ওয়েব সাইট / ওয়েব অ্যাপ্লিকেশনের ফাইলের ক্ষেত্রেও এটি প্রযোজ্য ):


.NET এ অ্যাপ্লিকেশনসেটিং
(উত্স কোড এবং প্রযুক্তিগত বিশদ দেখতে উপরে ক্লিক করুন)


পেশাদাররা

  • তারা বস্তুর ধরণের ( serializeAsসম্পত্তির মাধ্যমে ) সহ টাইপ করা ডেটা সংরক্ষণ করার অনুমতি দেয়

  • তাদের একটি ব্যবহারকারী এবং অ্যাপ্লিকেশন সুযোগ রয়েছে, ডিফল্ট মান সংরক্ষণ করতে দেয়

  • এগুলি ভিজ্যুয়াল স্টুডিওর কনফিগারেশন বিভাগে সমর্থিত

  • লম্বা স্ট্রিং এবং / অথবা বিশেষ অক্ষরের সাথে ডেটা খুব ভাল সমর্থন করে (উদাহরণস্বরূপ, এমবেডড জেএসএন স্ট্রিংগুলিতে ডাবল উদ্ধৃতি রয়েছে)


কনস

  • ব্যবহারকারীর সেটিংস ব্যবহারকারীর প্রোফাইলে আলাদা জায়গায় সংরক্ষণ করা হয় (একটি ক্রিপ্টিক পাথ সহ), এটি পরিষ্কার করা কঠিন হতে পারে

  • অ্যাপ্লিকেশন স্কোপ সেটিংস কেবলমাত্র অ্যাপলিকেশন চলাকালীন পঠনযোগ্য (কেবলমাত্র ব্যবহারকারী স্কোপ সেটিংস রানটাইমের সময় পরিবর্তন করা যেতে পারে)

  • ভিজ্যুয়াল স্টুডিওর সেটিংস ডিজাইনার দ্বারা নির্মিত পদ্ধতি কোডটি পড়ুন / লিখুন, তৃতীয় পক্ষের সরঞ্জামগুলি দ্বারা সরাসরি সরবরাহ করা হয়নি (কার্যক্ষম সমাধানের জন্য উপরের লিঙ্কটি দেখুন)


নেট
আপডেটে অ্যাপসেটেটিংগুলি : নেট কোরে অ্যাপসেটেটিংগুলি
(উত্স কোড এবং প্রযুক্তিগত বিশদ দেখতে উপরে ক্লিক করুন)


পেশাদাররা

  • "হালকা ওজন", অর্থাৎ পরিচালনা করা সহজ Are

  • অ্যাপ্লিকেশন রানটাইম সময় অ্যাক্সেস পড়ুন এবং লিখুন

  • এগুলি সহজেই
    ইন্টারনেট তথ্য পরিষেবাদি (আইআইএস) ম্যানেজারে অ্যাডমিনিস্ট্রেটরদের দ্বারা সম্পাদনা করা যেতে পারে
    (বৈশিষ্ট্যগুলি দেখুন -> অ্যাপ্লিকেশন সেটিংস, নোটটির নামটি বিভ্রান্ত করছে বলে মনে রাখবেন যেহেতু এটি কেবল অ্যাপসেটিংগুলিকেই পরিচালনা করতে পারে এবং অ্যাপ্লিকেশনগুলি নয়)


কনস

  • সমর্থন কেবল স্ট্রিং ডেটা; স্ট্রিং দৈর্ঘ্য এবং বিশেষ অক্ষর সীমিত

  • তাদের কোনও ব্যবহারকারীর সুযোগ নেই

  • তারা ডিফল্ট মান সমর্থন করে না

  • ভিজ্যুয়াল স্টুডিওর কনফিগারেশন বিভাগে সরাসরি সমর্থিত নয়



9

আমি একক মানগুলি সংরক্ষণ এবং অ্যাক্সেসের জন্য সহজ সংস্করণে কাজ করতে পছন্দ করি।

<appSettings>
    <add key="MyConfigKey" value="true"/>
</appSettings>

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

আপনি এখানে ক্লাসটি দেখতে বা ডাউনলোড করতে পারেন:

http://www.drewnoakes.com/code/util/app-settings-util/


3
+1, এটি আরও সহজ বিশেষত আপনার যদি একাধিক অ্যাসেমব্লি থাকে (সেটিংসে সাধারণত অ্যাসেম্বলিকে একটি বিভাগ থাকে)। আমারও তেমন সহায়ক সহায়ক বর্গ রয়েছে। বিটিডাব্লু আপনার ক্লাসটি বর্তমানে কনফিগার ফাইলটি সংস্কৃতি-সংবেদনশীল স্ট্রিং ব্যবহার করার প্রত্যাশা করে যা কোনও ভাল জিনিস নয় - যেমন "Double.TryParse (গুলি, সংখ্যাসত্তা.কন্যা, সংস্কৃতিInfo.InvariantC সংস্কৃতি, ফলাফল ফলাফল)" "Double.TryParse (পরিবর্তে ফলাফল) হওয়া উচিত" s, ফলাফল ফলাফল) "। নিতপিকের জন্যও, এমএস কোডিং নির্দেশিকাটি getInt32, GetInt16, GetInt, GetShort, GetBool এর চেয়ে getInt32, getBoolean এর সুপারিশ করে।
জো

এটি দুর্দান্ত, তবে অ্যাপসেটেটিংগুলির পক্ষে প্রো এবং কনস সম্পর্কে প্রশ্নের উত্তর দেয় না।
ম্যাট

@ ম্যাট, প্রো এটি হ'ল এটি সহজ। কন যে এটি সহজ। আপনার যদি কেবল কয়েকটি আক্ষরিক মান প্রয়োজন (বুলস, ইনটস, স্ট্রিং ইত্যাদি) তবে এই পদ্ধতির বাক্সের জন্য সবচেয়ে বেশি ধাক্কা। আপনার যদি কাঠামোগত ডেটা, নেমস্পেস বিচ্ছেদ, এক্সএসডি সমর্থিত বৈধতা / সমাপ্তি ইত্যাদির প্রয়োজন হয় তবে কাস্টম বিভাগটি আরও ভাল ফিট হতে পারে। অন্য বিকল্পটি হ'ল App.configফাইলটিকে সম্পূর্ণ উপেক্ষা করুন এবং আপনার নিজের কনফিগারেশন ফাইলটি ব্যবহার করুন। প্রচুর গ্রন্থাগার এটি করে। এনএলগ মনে আসে।
ড্রয় নোকস

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