ตัวแปรภายใน 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นี้จะช่วยให้ฉันเมื่อฉันติดตั้งโปรแกรมของฉันในเซิร์ฟเวอร์ที่แตกต่างกันและสถานที่นั้นฉันเท่านั้นที่จะมีการเปลี่ยนแปลงหนึ่งรายการในทั้งหมดของฉัน (ฉันรู้ว่าฉันสามารถจัดการการเชื่อมต่อทั้งหมดในโค้ดได้ แต่ฉันชอบวิธีนี้มากกว่า)


ฉันคิดว่าเขากำลังพูดถึงการกำหนดตัวแปรที่จะใช้ในคีย์ appSettings โดยตรงภายในไฟล์กำหนดค่า
Michaël Carpentier

1
ฉันได้ตรวจสอบโดยใช้การประกาศ XML <! ENTITY> แต่ไม่รองรับเนื่องจากวิธีที่ MS จัดการไฟล์ web.config
chilltemp

ขอบคุณสำหรับความพยายามของคุณ. ฉันไม่ต้องการแก้ไขรหัสใด ๆ โค้ดมีคำสั่งอยู่แล้วว่า string dir2 = ConfigurationManager.AppSettings ["Dir2"] ฉันต้องการล้าง app.config เท่านั้นซึ่งตอนนี้ระบุว่า value = "D: \ blahdir \ Dir2" แทนค่า = "[MyBaseDir] \ Dir2"
DeeStackOverflow

คำตอบ:


7

คำถามที่ดี.

ฉันไม่คิดว่าจะมี ฉันเชื่อว่าคงจะเป็นที่ทราบกันดีอยู่แล้วหากมีวิธีง่ายๆและฉันเห็นว่า Microsoft กำลังสร้างกลไกใน Visual Studio 2010 สำหรับการปรับใช้ไฟล์การกำหนดค่าต่างๆสำหรับการปรับใช้และการทดสอบ

ด้วยที่กล่าวว่าอย่างไรก็ตาม; ฉันพบว่าคุณในConnectionStringsส่วนนี้มีตัวยึดตำแหน่งที่เรียกว่า "| DataDirectory |" บางทีคุณอาจจะดูว่ามีอะไรทำงานที่นั่น ...

นี่คือชิ้นส่วนจากการ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>

นั่นคือข้อมูลที่น่าสนใจ อาจมีการเข้าถึงตัวแปรโดยใช้สัญลักษณ์ท่อ ("|")? อืม .. สงสัยว่าจะใช้ได้ไหม: <add key = "Dir2" value = "| MyBaseDir | \ Dir2" />
DeeStackOverflow

4
ค่า DataDirectory เป็นองค์ประกอบข้อมูลใน AppDomain คุณสามารถแทนที่ค่าได้โดยใช้ AppDomain.CurrentDomain.SetData ("DataDirectory", dataPath); ฉันยังไม่ได้ทดสอบว่าคุณสามารถกำหนดตัวแปรอื่น ๆ เช่นนี้และทำให้ "ขยายอัตโนมัติ" ได้หรือไม่ ...
Peter Lillevold

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>

จากนั้นในรหัส. NET ของคุณ (ฉันจะใช้ C # ในตัวอย่างของฉัน) คุณสามารถสร้างสองคลาสดังนี้:

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"

1
ขอบคุณ แต่ฉันกำลังพยายามทำสิ่งนี้โดยไม่ต้องแก้ไขโค้ดใด ๆ เนื่องจากเป็นความเจ็บปวดในขั้นตอนนี้
DeeStackOverflow

มีข้อผิดพลาดเล็กน้อยในบรรทัดสุดท้ายของโค้ด (ไม่นับวงเล็บปีกกา): "return System.IO.Path.Combine (MyBaseDir, Dir1);" ควรเป็น "return System.IO.Path.Combine (BaseDirectory, Dir1);" แทนหรือมิฉะนั้นวิธีนี้ควรเปลี่ยนชื่อจาก 'Base Directory' เป็น 'MyBaseDir'
ใครที่

16

คุณสามารถทำได้โดยใช้ห้องสมุดของฉันกว้างขวาง นอกจากนี้ยังมีใน nuget ที่นี่

ได้รับการออกแบบให้เป็นกรณีการใช้งานหลัก

ตัวอย่างการกลั่นกรอง (โดยใช้ AppSettings เป็นแหล่งเริ่มต้นสำหรับการขยายโทเค็น)

ใน 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;"

หรือ

ใช้ Dynamic ConfigurationManager wrapper "Config" ดังนี้ (ไม่จำเป็นต้องเรียก Explicit เพื่อขยาย ()):

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 (โดยใช้ AppSettings เป็นแหล่งเริ่มต้นสำหรับการขยายโทเค็น)

ใน 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>

ใช้วิธีการขยาย. Expand () บนสตริงที่จะขยาย:

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

4
ฉันคิดว่าคำตอบนี้อยู่ในระดับต่ำมาก !!
อาหมัด

ขอบคุณ Ahmad! แจ้งให้เราทราบว่าคุณชอบ Expansive อย่างไร
anderly

แม้ว่านี่จะเป็น 'ความละเอียด' ของการตั้งค่าแอปรันไทม์ แต่ก็ช่วยแก้ปัญหาของฉันในการมีคู่ค่าคีย์ซ้ำ ๆ เราลดการบำรุงรักษา config ของเราลงได้มาก ยูโทเปียสัมบูรณ์ที่นี่จะต้องเป็นปลั๊กอิน build time เพื่อทำงานร่วมกับ SlowCheetah ฉันจะ +1 อีกครั้งถ้าทำได้ สิ่งที่ยอดเยี่ยม anderly
Ahmad

โปรดให้ตัวอย่างสั้น ๆ เกี่ยวกับวิธีใช้ห้องสมุดของคุณเพื่อบรรลุเป้าหมายนี้ได้หรือไม่
Ryan Gates

สำหรับใครก็ตามที่เพิ่งสะดุดกับสิ่งนี้โครงการนี้ได้ตายไป 6 ปีแล้วตั้งแต่ปี 2011 :(
user1003916

4

ฉันคิดว่าฉันเพิ่งเห็นคำถามนี้

กล่าวโดยย่อไม่ไม่มีการแก้ไขตัวแปรภายในการกำหนดค่าแอปพลิเคชัน

คุณมีสองทางเลือก

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

นี่คือโพสต์ที่ถูกต้อง โพสต์ก่อนหน้าของฉัน (คำถามเดียวกัน) ไม่แสดงตัวอย่างรายการ app.config xml ฉันตรวจสอบลิงก์ของคุณ - มันใช้งานได้มากเกินไปและไม่ต้องการใช้เวลาที่นั่นเรามี app.configs แยกต่างหากสำหรับกล่องต่างๆและฉันต้องการหลีกหนีจากสิ่งนั้น
DeeStackOverflow

3

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

อีกทางเลือกหนึ่งคือกำหนดส่วนการกำหนดค่าของคุณเองซึ่งรองรับสิ่งนี้ ตัวอย่างเช่นลองนึกภาพ xml นี้:

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

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


ฉันไม่เห็น xml ของคุณในโพสต์ (เยื้องอักขระบรรทัด 5 ของคุณเพื่อให้สามารถโพสต์แท็ก xml ได้ - ฉันมีปัญหาเดียวกันในครั้งที่แล้ว) นอกจากนี้ 'วัตถุกำหนดค่าแบบกำหนดเอง' คืออะไร? ฉันไม่ชอบการเข้ารหัสเป็นศูนย์เพื่อให้บรรลุสิ่งนี้เนื่องจากการเปลี่ยนแปลงการเข้ารหัสในขั้นตอนนี้จะทำให้เรากลับมามากขึ้น
DeeStackOverflow

การกำหนดค่าแบบกำหนดเองเกี่ยวข้องกับการเข้ารหัส [อย่างง่าย] แต่ IMHO เป็นตัวเลือกที่ดีที่สุดของคุณเสมอ ฉันแทบไม่เคยใช้ appSettings เลยเลือกที่จะสร้างการกำหนดค่าที่กำหนดเองสำหรับทุกโครงการแทน
Portman

3

โดยปกติฉันเขียนคลาสแบบคงที่พร้อมคุณสมบัติเพื่อเข้าถึงการตั้งค่าแต่ละอย่างของ web.config ของฉัน

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 (อิมพอร์ตใน VB)
cjk

2
ข้อบ่งชี้นี้ถูกต้อง แต่ไม่ใช่คำตอบสำหรับคำถามที่ถาม
Michaël Carpentier

1

ผมขอแนะนำให้คุณDslConfig ด้วย DslConfig คุณสามารถใช้ไฟล์กำหนดค่าลำดับชั้นจาก Global Config, Config ต่อเซิร์ฟเวอร์โฮสต์เพื่อกำหนดค่าต่อแอ็พพลิเคชันบนโฮสต์เซิร์ฟเวอร์แต่ละตัว (ดู AppSpike)
หากสิ่งนี้ซับซ้อนสำหรับคุณคุณสามารถใช้ global config Variables.var ได้
เพียงแค่กำหนดค่าใน Varibales.var

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

และรับค่า config ด้วย

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

0

ฉันไม่คิดว่าคุณสามารถประกาศและใช้ตัวแปรเพื่อกำหนดคีย์ appSettings ภายในไฟล์กำหนดค่าได้ ฉันจัดการการเรียงต่อกันในโค้ดเหมือนกับคุณมาโดยตลอด


0

ฉันกำลังดิ้นรนเล็กน้อยกับสิ่งที่คุณต้องการ แต่คุณสามารถเพิ่มไฟล์ลบล้างในการตั้งค่าแอพจากนั้นตั้งค่าไฟล์ลบล้างนั้นตามสภาพแวดล้อม

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

0

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


0

ฉันอยากจะแนะนำให้ทำตามวิธีแก้ปัญหาของ Matt Hamsmith หากเป็นปัญหาในการนำไปใช้ทำไมไม่สร้างวิธีการขยายที่ใช้ในพื้นหลังในคลาส AppSettings

สิ่งที่ต้องการ:

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

    }

ภายในวิธีการที่คุณค้นหาผ่าน DictionaryInfoConfigSection โดยใช้ Linq และส่งคืนค่าด้วยคีย์ที่ตรงกัน คุณจะต้องอัปเดตไฟล์ config เป็นบางอย่างตามบรรทัดเหล่านี้:

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

0

ฉันคิดวิธีแก้ปัญหานี้:

  1. ในแอปพลิเคชัน Settings.settings ฉันกำหนดตัวแปร ConfigurationBase (ด้วย type = string Scope = Application)
  2. ฉันแนะนำตัวแปรในแอตทริบิวต์เป้าหมายใน Settings.settings แอตทริบิวต์เหล่านั้นทั้งหมดจะต้องถูกตั้งค่าเป็น Scope = User
  3. ใน app.xaml.cs ฉันอ่านค่าหาก ConfigurationBase
  4. ใน app.xaml.cs ฉันแทนที่ตัวแปรทั้งหมดด้วยค่า ConfigurationBase ในการแทนที่ค่าในขณะทำงานต้องตั้งค่าแอตทริบิวต์เป็น Scopr = User

ฉันไม่ค่อยพอใจกับวิธีแก้ปัญหานี้เพราะฉันต้องเปลี่ยนแอตทริบิวต์ทั้งหมดด้วยตนเองหากฉันเพิ่มใหม่ฉันต้องพิจารณามันใน app.xaml.cs

นี่คือตัวอย่างโค้ดจาก App.xaml.cs:

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

อัปเดต

เพิ่งพบการปรับปรุง (ข้อมูลโค้ดอีกครั้งจาก app.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);
    }
}

ตอนนี้การแทนที่ใช้ได้กับแอตทริบิวต์ทั้งหมดในการตั้งค่าของฉันที่มี Type = string และ Scope = User ฉันคิดว่าฉันชอบวิธีนี้

อัพเดท 2

เห็นได้ชัดว่าการตั้งค่าขอบเขต = ไม่จำเป็นต้องใช้แอปพลิเคชันเมื่อทำงานผ่านคุณสมบัติ


0

สามแนวทางแก้ไขที่เป็นไปได้

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

สำหรับตัวอย่างนี้ฉันใช้การตั้งค่าแอพต่อไปนี้ในแอปพลิเคชันคอนโซล:

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

1. ใช้ตัวแปรสภาพแวดล้อม

ฉันเชื่อว่าคำตอบของ autocro autocroสัมผัสได้ ฉันแค่ใช้งานที่ควรจะเพียงพอเมื่อสร้างหรือดีบักโดยไม่ต้องปิดวิชวลสตูดิโอ ฉันใช้วิธีนี้ย้อนกลับไปในวันที่ ...

  • สร้างเหตุการณ์ก่อนสร้างที่จะใช้ตัวแปร MSBuild

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

    SETX BaseDir "$(ProjectDir)"

  • รีเซ็ตตัวแปร; โดยใช้สิ่งต่อไปนี้:

    รีเฟรชตัวแปรสภาพแวดล้อมบน Stack Overflow

  • ใช้การตั้งค่าในรหัสของคุณ:

'

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}");
}

'

2. ใช้การแก้ไขสตริง:

  • ใช้ฟังก์ชัน string.Format ()

`

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}");
}

`

3. การใช้คลาสคงที่นี่เป็นวิธีแก้ปัญหาที่ฉันใช้เป็นส่วนใหญ่

  • การนำไปใช้งาน

`

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>

Program.cs

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.