ข้อดีข้อเสียของ AppSettings เทียบกับ applicationSettings (. NET app.config / Web.config)


167

เมื่อพัฒนา. NET Windows Forms Application เรามีตัวเลือกระหว่าง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>

ในรหัสตัวอย่างของ MS พวกเขาใช้ appSettings msdn.microsoft.com/en-us/library/…นี่ฉันพบว่าสับสน :(
ล่า

พบบทความนี้codeproject.com/KB/files/ ......ดูเหมือนว่าบ่งบอกว่าการตั้งค่า app ใช้สำหรับ w / r แอปพลิเคชันการตั้งค่าใช้สำหรับการอ่านเท่านั้น
ล่า

บทความอื่นที่เกี่ยวข้องกับstackoverflow.com/questions/453161/…
ล่า

โปรดทราบว่าเดียวกันนี้ใช้กับ web.config ดังนั้นฉันจึงเพิ่มแท็ก web.config ในคำถามนี้
Matt

คำตอบ:


151

พื้นฐาน<appSettings>ง่ายต่อการจัดการ - เพียงตบใน<add key="...." value="..." />รายการและคุณเสร็จแล้ว

ข้อเสียคือ: ไม่มีการตรวจสอบประเภทเช่นคุณไม่สามารถสันนิษฐานได้อย่างปลอดภัยว่าหมายเลขของคุณที่คุณต้องการกำหนดค่ามีจำนวนจริง ๆ - ใครบางคนสามารถใส่สตริงลงในการตั้งค่าที่ ..... คุณเพียงแค่เข้าถึงมันเป็นConfigurationManager["(key)"]แล้ว ให้คุณรู้ว่าคุณกำลังทำอะไรอยู่

นอกจากนี้เมื่อเวลาผ่านไปความ<appSettings>สามารถในการรับที่ซับซ้อนและยุ่งเหยิงหากส่วนต่าง ๆ ของแอปของคุณเริ่มวางสิ่งต่าง ๆ ในนั้น (จำไฟล์ windows.ini เก่า? :-))

หากคุณสามารถทำได้ฉันต้องการและแนะนำให้ใช้ส่วนการกำหนดค่าของคุณเอง - ด้วย. NET 2.0 มันง่ายมาก ๆ ด้วยวิธีนั้นคุณสามารถ:

  • a) กำหนดการตั้งค่าของคุณในรหัสและตั้งให้ปลอดภัยและตรวจสอบ
  • b) คุณสามารถแยกการตั้งค่าของคุณออกจากคนอื่นได้อย่างหมดจด และคุณสามารถใช้รหัสการกำหนดค่าอีกครั้งได้ด้วย!

มีชุดบทความที่ดีมาก ๆ สำหรับคุณที่จะเข้าใจระบบการกำหนดค่า. NET 2.0 บน CodeProject:

  1. ไขปริศนาของการกำหนดค่า. NET 2.0

  2. ถอดรหัสความลึกลับของการกำหนดค่า. NET 2.0

  3. ถอดรหัสความลึกลับของการกำหนดค่า. NET 2.0

แนะนำเป็นอย่างยิ่ง! Jon Rista ทำงานได้อย่างยอดเยี่ยมในการอธิบายระบบการกำหนดค่าใน. NET 2.0


2
ฉันพบว่าการตั้งค่าแอปพลิเคชันการตั้งค่าการเพิ่มแก้ไขและลบการตั้งค่าได้ง่ายขึ้นโดยที่คุณไม่ต้องเขียนบรรทัดของรหัสรวมถึงการพิมพ์ที่ปลอดภัยและคุณสามารถกำหนดขอบเขตให้กับผู้ใช้หรือแอปพลิเคชันได้เพราะคุณสามารถใช้แท็บ คุณสมบัติใน VS
markmnl

20

การตั้งค่าแอปพลิเคชันสามารถควบคุมได้จากนักออกแบบ (โดยปกติจะมีไฟล์ Settings.settings ตามค่าเริ่มต้น) ดังนั้นจึงสามารถแก้ไขได้ง่ายขึ้นและคุณสามารถเข้าถึงได้โดยทางโปรแกรมผ่านคลาสการตั้งค่าที่ปรากฏเป็นคุณสมบัติที่พิมพ์อย่างรุนแรง คุณยังสามารถตั้งค่าแอปพลิเคชันและระดับผู้ใช้รวมถึงการตั้งค่าเริ่มต้นสำหรับการย้อนกลับ

สิ่งนี้มีให้ตั้งแต่. NET 2.0 เป็นต้นไปและเลิกใช้วิธีอื่นในการทำ (เท่าที่ฉันสามารถบอกได้)

ดูรายละเอียดเพิ่มเติมได้ที่: msdn.microsoft.com/en-us/library/k4s6c3a0.aspx


14

ฉันใช้รูปแบบที่ฉันพบในขณะที่คุณใช้แท็ก xml พื้นฐาน แต่ห่อการตั้งค่าในระดับ config คงที่ ดังนั้น - แอป DIY การตั้งค่า

รูปแบบการกำหนดค่าคงที่ DotNetPearls

หากคุณทำเช่นนี้คุณจะสามารถ:

  • ใช้ชุดค่าการตั้งค่าที่แตกต่างกันสำหรับสภาพแวดล้อมที่แตกต่างกัน (dev, test, prod)
  • จัดให้มีค่าเริ่มต้นที่สมเหตุสมผลสำหรับการตั้งค่าแต่ละอย่าง
  • ควบคุมวิธีการกำหนดและสร้างอินสแตนซ์

เป็นเรื่องน่าเบื่อที่จะตั้งค่า แต่ทำงานได้ดีซ่อนการอ้างอิงถึงชื่อคีย์และพิมพ์ลงไปอย่างมาก รูปแบบชนิดนี้ใช้งานได้ดีสำหรับการกำหนดค่าที่แอปพลิเคชันไม่ได้เปลี่ยนแปลง แต่คุณอาจทำงานเพื่อรองรับการเปลี่ยนแปลงได้เช่นกัน

Config:

<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ผมขอแนะนำให้คุณมองเข้าไปในรายละเอียดทางเทคนิคของทั้งสอง ฉันได้รวมลิงค์ที่คุณสามารถค้นหาซอร์สโค้ดสำหรับการจัดการอธิบายรายละเอียดทางเทคนิคเพิ่มเติมด้านล่าง

ให้ฉันสรุปสิ่งที่ฉันจำได้สั้น ๆ เมื่อฉันทำงานกับพวกเขา ( หมายเหตุ:ไฟล์นี้ใช้ได้กับweb.configไฟล์ของเว็บไซต์ / แอปพลิเคชันเว็บ):


applicationSettings ใน. NET
(คลิกด้านบนเพื่อดูซอร์สโค้ดและรายละเอียดทางเทคนิค)


ข้อดี

  • อนุญาตให้จัดเก็บข้อมูลที่พิมพ์รวมถึงประเภทวัตถุ (ผ่านserializeAsคุณสมบัติ)

  • มีขอบเขตผู้ใช้และแอปพลิเคชันซึ่งอนุญาตให้เก็บค่าเริ่มต้น

  • สนับสนุนในส่วนกำหนดค่าของ Visual Studio

  • สนับสนุนสตริงที่ยาวและ / หรือข้อมูลที่มีอักขระพิเศษ (ตัวอย่างเช่นสตริง JSON แบบฝังที่มีเครื่องหมายคำพูดคู่)


จุดด้อย

  • การตั้งค่าผู้ใช้จะถูกเก็บไว้ในสถานที่ที่แตกต่างกันในโปรไฟล์ผู้ใช้ (ด้วยเส้นทางที่มีความลับ) อาจทำความสะอาดได้ยาก

  • การตั้งค่าขอบเขตแอปพลิเคชันเป็นแบบอ่านอย่างเดียวในช่วงรันไทม์ของแอปพลิเคชัน (การตั้งค่าขอบเขตผู้ใช้เท่านั้นที่สามารถเปลี่ยนแปลงได้ในระหว่างการรันไทม์)

  • โค้ดวิธีการอ่าน / เขียนที่สร้างโดยผู้ออกแบบการตั้งค่าของ Visual Studio ไม่ได้ให้บริการโดยตรงโดยเครื่องมือของบุคคลที่สาม (ดูลิงก์ด้านบนสำหรับวิธีแก้ปัญหา)


AppSettings ใน. NET
Update: AppSettings ใน. NET Core
(คลิกด้านบนเพื่อดูซอร์สโค้ดและรายละเอียดทางเทคนิค)


ข้อดี

  • คือ "น้ำหนักเบา" คือง่ายต่อการจัดการ

  • อ่านและเขียนการเข้าถึงระหว่างรันไทม์ของแอปพลิเคชัน

  • ผู้ดูแลระบบสามารถแก้ไขได้อย่างง่ายดายใน
    Internet Information Services (IIS) Manager
    (มุมมองคุณลักษณะ -> การตั้งค่าแอปพลิเคชันโปรดทราบว่าชื่อของไอคอนนั้นทำให้เข้าใจผิดเนื่องจากสามารถจัดการได้เฉพาะ AppSettings และไม่ใช่ ApplicationSettings)


จุดด้อย

  • สนับสนุนข้อมูลสตริงเท่านั้น ความยาวสตริงและอักขระพิเศษมี จำกัด

  • พวกเขาไม่มีขอบเขตผู้ใช้

  • พวกเขาไม่สนับสนุนค่าเริ่มต้น

  • ไม่ได้รับการสนับสนุนโดยตรงในส่วนการกำหนดค่าของ Visual Studio



9

ฉันชอบทำงานกับเวอร์ชันที่ง่ายกว่าสำหรับการจัดเก็บและเข้าถึงค่าเดียว

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

ฉันเขียนคลาสยูทิลิตี้เพื่อเข้าถึงค่าต่างๆในแบบที่ปลอดภัยซึ่งอนุญาตสำหรับค่าเริ่มต้น หากไม่ได้ระบุค่าเริ่มต้นจะมีข้อความแสดงข้อยกเว้นที่เป็นประโยชน์

คุณสามารถดู / ดาวน์โหลดคลาสได้ที่นี่:

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


3
+1 มันง่ายกว่าโดยเฉพาะถ้าคุณมีชุดประกอบหลายชุด (โดยทั่วไปแล้วการตั้งค่าจะมีส่วนต่อชุดประกอบ) ฉันมีชั้นผู้ช่วยที่คล้ายกัน BTW คลาสของคุณคาดว่าไฟล์กำหนดค่าจะใช้สตริงที่ไวต่อวัฒนธรรมซึ่งไม่ใช่สิ่งที่ดี - เช่นควรเป็น "Double.TryParse (s, NumberStyles.Any, CultureInfo.InvariantCulture, ผลลัพธ์") แทนที่จะเป็น "Double.TryParse ( ผลลัพธ์ออกมา) ". นอกจากนี้สำหรับ nitpick แนวทางการเขียนโปรแกรม MS แนะนำ GetInt32, GetInt16, GetBoolean มากกว่า GetInt, GetShort, GetBool
Joe

ไม่เป็นไร แต่ไม่ตอบคำถามเกี่ยวกับโปรและข้อเสียของ AppSettings
Matt

@ Matt ผู้เชี่ยวชาญคือมันง่ายกว่า ข้อเสียคือมันง่ายกว่า หากคุณต้องการค่าตามตัวอักษรเพียงสองสามตัว (bools, ints, string ฯลฯ ) วิธีการนี้จะให้ผลที่ดีที่สุดสำหรับเจ้าชู้ หากคุณต้องการข้อมูลที่มีโครงสร้างการแยกชื่อเนมสเปซ XSD รองรับการตรวจสอบ / เสร็จสิ้นเป็นต้นดังนั้นส่วนที่กำหนดเองอาจเหมาะสมกว่า อีกทางเลือกหนึ่งคือละเว้นApp.configไฟล์ทั้งหมดและใช้ไฟล์กำหนดค่าของคุณเอง มีห้องสมุดจำนวนมากที่ทำเช่นนั้น NLog มาถึงใจ
Drew Noakes

@DrewNoakes - ฉันเห็นด้วยกับคุณ ขอขอบคุณสำหรับการชี้แจง.
Matt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.