ในแอปพลิเคชัน .Net เรามักจะเห็นว่าโครงการโครงการที่สร้างโดย VS สำหรับเราจะมีไฟล์เช่น App.config หรือ Web.config ไฟล์นี้เป็นสิ่งที่เราเรียกว่าไฟล์กำหนดค่าแอปพลิเคชัน ไฟล์นี้อธิบายข้อมูลบางอย่างที่เกี่ยวข้องกับแอปพลิเคชันของเรา เช่น การเชื่อมต่อฐานข้อมูล โหมดการตรวจสอบสิทธิ์ ฯลฯ ในโปรแกรม เราสามารถใช้คุณสมบัติ ConnectionStrings ของ ConfigurationManager เพื่อรับข้อมูลสตริงการเชื่อมต่อฐานข้อมูลในไฟล์กำหนดค่าได้อย่างสะดวก
แต่บางครั้งเราจำเป็นต้องขยายและเพิ่มองค์ประกอบที่กำหนดเองแทนที่จะใช้เพียงการกำหนดค่าเริ่มต้น ตัวอย่างเช่น เราอาจจำเป็นต้องโหลดคลาสแบบไดนามิกและเริ่มต้นคลาสนั้นเมื่อโปรแกรมเริ่มทำงาน แต่คลาสนี้หรือข้อมูลการเริ่มต้นไม่เป็นที่รู้จักสำหรับเราในระหว่างการออกแบบโปรแกรม ฉันเชื่อว่าทุกคนเคยประสบปัญหาเช่นนี้ ดังนั้นฉันจะไม่อธิบายมากเกินไปที่นี่ วิธีที่ดีที่สุดคือการเขียนสิ่งเหล่านี้ที่อาจเปลี่ยนแปลงลงในไฟล์การกำหนดค่า เมื่อคุณแน่ใจ คุณจะต้องแก้ไขไฟล์การกำหนดค่า แทนที่จะใช้เวลา 30 วินาทีในการเปิด VS เมื่อผลิตภัณฑ์กำลังจะออนไลน์ รหัส
การเพิ่มองค์ประกอบที่กำหนดเองลงในไฟล์การกำหนดค่านั้นง่ายดายและใช้เวลาเพียงสองขั้นตอนเท่านั้น:
1. ลงทะเบียนชื่อโหนดที่คุณต้องการกำหนดและตัวจัดการส่วนการกำหนดค่าที่ใช้ในการประมวลผลโหนดในโหนด <configSections> รหัสมีดังนี้:
1 <configSections>2 <section name="dbFactory" type="DbFactory.Configuration.DbFactorySection,DbFactory.Configuration"/>3 </configSections>
2. เพิ่มโหนดที่กำหนดเองในตำแหน่งที่เหมาะสม รหัสมีดังนี้:
1 <configSections> 2 <section name="dbFactory" type="DbFactory.Configuration.DbFactorySection,DbFactory.Configuration"/> 3 </configSections> 4 <dbFactory> 5 <โรงงานเริ่มต้น="sql"></default> 6 <โรงงาน> 7 <เพิ่มชื่อ = "sql" ชุด = "Hello.Data" class = "SqlDbFactory" /> 8 < เพิ่มชื่อ = "oracle" ชุด = "Hello.Data" class = "OracleDbFactory" /> 9 </ โรงงาน>10 </dbFactory>
เพิ่มโหนดที่กำหนดเองแล้ว แต่เราจะรับข้อมูลการกำหนดค่านี้ในโปรแกรมได้อย่างไร ฉันเชื่อว่าพวกคุณหลายคนเป็นผู้เชี่ยวชาญในการเล่นกับ XML หากคุณใช้คลาสบางคลาสภายใต้ระบบ เป็นเช่นนี้จริง ๆ ค่ะ อาจารย์เป็นอาจารย์จริงๆ ค่ะ แต่ถ้าดำเนินการในลักษณะนี้ ฉันก็ไม่จำเป็นต้องเขียนโพสต์ในบล็อกนี้จริงๆ
กรอบงาน .Net ใช้ API การกำหนดค่าจำนวนมากเพื่อให้เราดำเนินการกับไฟล์การกำหนดค่าได้ง่ายขึ้น ในขั้นตอนแรก เราได้กล่าวถึงตัวจัดการส่วนการกำหนดค่า ซึ่งใช้ในการอ่านและเขียนข้อมูลโหนดที่เรากำหนดเอง แล้วเราจะใช้ตัวจัดการส่วนการกำหนดค่าได้อย่างไร? ก่อนอื่น มาดูคลาสและแนวคิดที่เกี่ยวข้องกันก่อน
ConfigurationSection: โหนดที่กำหนดเองจะต้องสืบทอดคลาสนี้เพื่อให้การประมวลผลที่กำหนดเองและการเข้าถึงส่วนการกำหนดค่าแบบกำหนดเองโดยทางโปรแกรม
ConfigurationElement: มันแสดงถึงองค์ประกอบภายในไฟล์การกำหนดค่า
ConfigurationElementCollection: มันแสดงถึงองค์ประกอบการกำหนดค่าที่มีคอลเลกชันขององค์ประกอบลูก
ด้วยคลาสเหล่านี้ เราสามารถสรุปได้ว่ามีองค์ประกอบการกำหนดค่าสองประเภทในไฟล์การกำหนดค่า
ขั้นแรก องค์ประกอบการกำหนดค่าเดียวคือองค์ประกอบที่สืบทอดมาจาก ConfigurationElement และไม่มีองค์ประกอบลูกใดๆ
ประการที่สอง องค์ประกอบการกำหนดค่าคอลเลกชันเป็นองค์ประกอบที่สืบทอดมาจาก ConfigurationElementCollection ซึ่งมีคอลเลกชันขององค์ประกอบลูก
แนวคิดต่างๆ มักจะค่อนข้างเป็นนามธรรม เพื่อให้เข้าใจสิ่งเหล่านี้ เราควรอธิบายรายละเอียดตามตัวอย่างที่เราให้ไว้ข้างต้น
มีสององค์ประกอบในส่วนการกำหนดค่า <dbFactory> ได้แก่ <default> และ <factorys> และองค์ประกอบ <factorys> มีองค์ประกอบย่อยสององค์ประกอบ ดังนั้น <default> จึงเป็นองค์ประกอบการกำหนดค่าเดียว และ <factorys> เป็นองค์ประกอบการกำหนดค่าคอลเลกชัน เราจำเป็นต้องใช้คลาสและคุณสมบัติที่สอดคล้องกับองค์ประกอบเหล่านี้ตามลำดับ
องค์ประกอบ <default>: เป็นองค์ประกอบประเภทเดียว ดังนั้นเราจึงสืบทอด ConfigurationElement มีแอตทริบิวต์โรงงานในองค์ประกอบนี้ ดังนั้นเราจึงกำหนดมันตามนั้นในชั้นเรียน รหัสมีดังนี้:
รหัส
คลาสสาธารณะ DefaultElement: ConfigurationElement { [ConfigurationProperty("factory")] โรงงานสตริงสาธารณะ { รับ { คืนสิ่งนี้ ["โรงงาน"] เป็นสตริง; } ตั้ง { นี้ ["โรงงาน"] = ค่า;
หมายเหตุ: เราจำเป็นต้องลงทะเบียนแอตทริบิวต์ ConfigurationProperty ของคุณสมบัติเหนือคำจำกัดความของคุณสมบัติ
<โรงงาน> องค์ประกอบลูก:
รหัส
FactoryElement คลาสสาธารณะ : ConfigurationElement { [ConfigurationProperty( "name" )] ชื่อสตริงสาธารณะ { get { return this["name"] as string; } set { this["name"] = value; )] ชุดสตริงสาธารณะ { get { return this["assembly"] as string; } set { this["assembly"] = value; } } [ConfigurationProperty("class")] คลาสสตริงสาธารณะ { get { return this[" class"] เป็นสตริง; } set { this["class"] = value; } } }
องค์ประกอบ <factorys> เป็นองค์ประกอบการรวบรวมและสืบทอด ConfigurationElementCollection
รหัส
FactoryElements ระดับสาธารณะ: ConfigurationElementCollection { แทนที่การป้องกัน ConfigurationElement CreateNewElement () { ส่งคืน FactoryElement ใหม่ (); } วัตถุแทนที่ที่ได้รับการป้องกัน GetElementKey ( องค์ประกอบ ConfigurationElement ) { กลับ ((FactoryElement) องค์ประกอบ) ชื่อ } FactoryElement นี้ [ชื่อสตริง] { รับ { กลับ BaseGet( ชื่อ ) เป็น FactoryElement;
คลาส ConfigurationElementCollection เป็นคลาสนามธรรม และคุณควรนำเมธอด CreateNewElement และเมธอด GetElementKey ไปใช้อย่างชัดเจน
<dbFactory> โหนด สืบทอดมาจาก ConfigurationSection
รหัส
คลาสสาธารณะ DbFactorySection : ConfigurationSection { [ConfigurationProperty("default")] DefaultElement DefaultFactory { รับ { return this["default"] as DefaultElement; } set { this["default"] = value; )] FactoryElements Factorys { รับ { คืนสิ่งนี้["โรงงาน"] เป็น FactoryElements; } ตั้งค่า { นี้["โรงงาน"] = ค่า;
ในที่สุดตัวจัดการส่วนการกำหนดค่าก็เสร็จสิ้น ใส่คลาสทั้งสี่นี้ไว้ในไดเร็กทอรีโปรเจ็กต์เดียวกันและคอมไพล์ลงใน DLL ในกรณีที่คุณต้องการรับข้อมูลการกำหนดค่า ให้อ้างอิง DLL นี้และใช้ส่วน DbFactorySection = ConfigurationManager.GetSection( "dbFactory" ) เป็น DbFactorySection;