การกำหนดค่า. NET (app.config / web.config / settings.settings)


162

ฉันมีแอปพลิเคชั่น. NET ซึ่งมีไฟล์การตั้งค่าที่แตกต่างกันสำหรับการสร้าง Debug และ Release เช่นไฟล์ debug app.config ชี้ไปที่การพัฒนาSQL Serverซึ่งมีการเปิดใช้งานการดีบักและเป้าหมายการปล่อยไปยัง SQL Server ที่ใช้งานจริง นอกจากนี้ยังมีการตั้งค่าอื่น ๆ ซึ่งบางอย่างมีความแตกต่างในการดีบัก / รีลีส

ปัจจุบันฉันใช้สองไฟล์การกำหนดค่าแยกต่างหาก (debug.app.config และ release.app.config) ฉันมีเหตุการณ์บิลด์ในโครงการที่ระบุว่านี่เป็นบิลด์รีลีสจากนั้นคัดลอก release.app.config ไปยัง app.config มิฉะนั้นให้คัดลอก debug.app.config ไปยัง app.config

ปัญหาคือแอปพลิเคชันดูเหมือนว่าจะได้รับการตั้งค่าจากไฟล์ settings.settings ดังนั้นฉันต้องเปิดการตั้งค่าการตั้งค่าใน Visual Studio ซึ่งแจ้งให้ฉันว่าการตั้งค่ามีการเปลี่ยนแปลงดังนั้นฉันยอมรับการเปลี่ยนแปลงบันทึก settings.settings และมี เพื่อสร้างใหม่เพื่อให้ใช้การตั้งค่าที่ถูกต้อง

มีวิธีที่ดีกว่า / แนะนำ / ที่ต้องการสำหรับการบรรลุผลที่คล้ายกัน? หรืออย่างเท่าเทียมกันฉันได้เข้าหานี้ผิดทั้งหมดและมีวิธีที่ดีกว่า


ฉันต้องการที่จะปิดการใช้งานการแก้ปัญหาใน windows จากฉันได้ลองโดยการยกเลิกการเลือกช่องทำเครื่องหมายทั้งหมดในการตั้งค่าการแก้ปัญหา แต่ยังคงฉันสามารถแก้จุดบกพร่องในถังปล่อย exe .. ใครก็ตามที่ช่วยฉันในเรื่องนี้ ..
Vinoth Narayan

คำตอบ:


62

การกำหนดค่าใด ๆ ที่อาจแตกต่างกันในสภาพแวดล้อมที่ควรจะเก็บไว้ที่ระดับเครื่องไม่ใช่ระดับแอพลิเคชัน (ข้อมูลเพิ่มเติมเกี่ยวกับระดับการกำหนดค่า)

เหล่านี้เป็นองค์ประกอบการกำหนดค่าที่ฉันมักจะจัดเก็บที่ระดับเครื่อง:

เมื่อแต่ละสภาพแวดล้อม (ผู้พัฒนาการรวมการทดสอบระยะการถ่ายทอดสด) มีการตั้งค่าเฉพาะของตนเองในไดเรกทอรี c: \ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727 \ CONFIGจากนั้นคุณสามารถเลื่อนระดับรหัสแอปพลิเคชันของคุณได้ การดัดแปลงภายหลังการสร้าง

และแน่นอนว่าเนื้อหาของไดเรกทอรี CONFIG ระดับเครื่องรับการควบคุมเวอร์ชันในที่เก็บอื่นหรือโครงสร้างโฟลเดอร์ที่แตกต่างจากแอปของคุณ คุณสามารถทำให้ไฟล์. config ของคุณควบคุมแหล่งข้อมูลได้ง่ายขึ้นผ่านการใช้configSourceอย่างชาญฉลาด

ฉันได้ทำสิ่งนี้เป็นเวลา 7 ปีโดยมีแอพพลิเคชั่น ASP.NET มากกว่า 200 รายการใน บริษัท ต่างๆมากกว่า 25 แห่ง (ไม่พยายามคุยโวเพียงต้องการแจ้งให้คุณทราบว่าฉันไม่เคยเห็นสถานการณ์ที่วิธีนี้ใช้ไม่ได้ )


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

1
จะไม่ทำงาน แต่ในยุคของเครื่องเสมือน Amazon EC2 และเซิร์ฟเวอร์ $ 400 จาก Dell ทุกคนทำอะไรที่จริงจังกับเครื่องที่แชร์หรือไม่ ไม่พยายามที่จะใจแข็ง - ฉันคิดว่าถ้าคุณทำงานบนเว็บเซิร์ฟเวอร์ที่ใช้ร่วมกันคุณควรประเมินใหม่
พอร์ตแมน

7
บริษัท ส่วนใหญ่ที่ฉันเคยทำงานกับไซต์ภายในโฮสต์แอปพลิเคชั่นหลายตัวในเซิร์ฟเวอร์เดียว - ต้องมีการประเมินค่าใหม่ในระดับองค์กร
MPritchard

แอปพลิเคชั่นหลายตัวบนเซิร์ฟเวอร์เดียวนั้นใช้ได้ตราบใดที่แอพทั้งหมดนั้นอยู่ใน "สภาพแวดล้อม" เดียวกัน นั่นคือคุณไม่ต้องการให้อินสแตนซ์สดของ App1 บนเซิร์ฟเวอร์เดียวกันกับอินสแตนซ์ DEV ของ App2 ตัวอย่างเช่นการตั้งค่า SMTP ของคุณจะถูกแชร์ในแอปพลิเคชันทั้งหมดของคุณ ในการผลิตคุณชี้ไปที่เซิร์ฟเวอร์อีเมลจริง ในการพัฒนาคุณชี้ไปที่ไฟล์บนดิสก์
Portman

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

52

สิ่งนี้อาจช่วยให้บางคนจัดการกับ Settings.settings และ App.config: ระวังแอตทริบิวต์ GenerateDefaultValueInCode ในบานหน้าต่างคุณสมบัติขณะแก้ไขค่าใด ๆ ในตาราง Settings.settings ใน Visual Studio (Visual Studio 2008 ในกรณีของฉัน)

หากคุณตั้งค่า GenerateDefaultValueInCode เป็น True (True เป็นค่าเริ่มต้นที่นี่!) ค่าเริ่มต้นจะถูกคอมไพล์เป็น EXE (หรือ DLL) คุณจะพบว่ามันฝังอยู่ในไฟล์เมื่อคุณเปิดในโปรแกรมแก้ไขข้อความธรรมดา

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


7
นี่คือสิ่งที่เกิดขึ้นกับฉันในช่วงสุดสัปดาห์ที่ผ่านมานี้ ฉันดึงผมออกมาจำนวนมากพยายามคิดว่าทำไมแอพของฉันถึงมองข้ามไฟล์แอพของฉัน มันควรจะเชื่อมต่อกับบริการเว็บและ url บริการอยู่ใน app.config ของฉัน ไม่ทราบสำหรับฉันเมื่อฉันสร้างการอ้างอิงเว็บมันยังสร้างไฟล์การตั้งค่าการตั้งค่าและฮาร์ดโค้ดค่าเริ่มต้นลงในรหัส แม้ว่าในที่สุดฉันก็หา (และลบ) ไฟล์การตั้งค่าค่าเริ่มต้นนั้นยังคงอยู่ในฮาร์ดโค้ดและฝังอยู่ใน exe ผิดหวังมาก !! ขอบคุณโพสต์นี้ตอนนี้ฉันสามารถกำจัด "ฟีเจอร์" นั้นได้
Mike K

+1 คำตอบนี้สำคัญอย่างยิ่ง : หากคุณต้องการให้การตั้งค่าของคุณเข้าไปในไฟล์ app.config ให้ตั้งค่าแอตทริบิวต์ GenerateDefaultValueInCode เป็น False (ค่าเริ่มต้นคือ True)
Sabuncu

34

มีคำถามที่เกี่ยวข้องที่นี่:

ปรับปรุงกระบวนการสร้างของคุณ

ไฟล์กำหนดค่ามาพร้อมกับวิธีการแทนที่การตั้งค่า:

<appSettings file="Local.config">

แทนที่จะตรวจสอบในสองไฟล์ (หรือมากกว่า) คุณเพียงตรวจสอบในไฟล์กำหนดค่าเริ่มต้นจากนั้นในแต่ละเครื่องเป้าหมายคุณใส่ Local.config ด้วยส่วน appSettings ที่มีการแทนที่สำหรับเครื่องนั้น

หากคุณใช้ส่วนกำหนดค่าค่าที่เทียบเท่าคือ:

configSource="Local.config"

แน่นอนว่าเป็นความคิดที่ดีที่จะทำสำเนาสำรองของไฟล์ Local.config ทั้งหมดจากเครื่องอื่นและตรวจสอบในที่อื่น แต่ไม่ได้เป็นส่วนหนึ่งของโซลูชันจริง นักพัฒนาแต่ละคนใส่ "ละเว้น" ในไฟล์ Local.config ดังนั้นจึงไม่ได้รับการตรวจสอบซึ่งจะเขียนทับไฟล์ของคนอื่น

(คุณไม่จำเป็นต้องเรียกมันว่า "Local.config" นั่นเป็นเพียงสิ่งที่ฉันใช้)


14

จากสิ่งที่ฉันกำลังอ่านดูเหมือนว่าคุณกำลังใช้ Visual Studio สำหรับกระบวนการสร้างของคุณ คุณคิดจะใช้ MSBuild และNantแทนไหม?

ไวยากรณ์ xml ของ Nant เป็นเรื่องแปลกเล็กน้อย แต่เมื่อคุณเข้าใจแล้วการทำในสิ่งที่คุณพูดถึงนั้นค่อนข้างน่ารำคาญ

<target name="build">
    <property name="config.type" value="Release" />

    <msbuild project="${filename}" target="Build" verbose="true" failonerror="true">
        <property name="Configuration" value="${config.type}" />
    </msbuild>

    <if test="${config.type == 'Debug'}">
        <copy file=${debug.app.config}" tofile="${app.config}" />
    </if>

    <if test="${config.type == 'Release'}">
        <copy file=${release.app.config}" tofile="${app.config}" />
    </if>

</target>

11

สำหรับผมแล้วมันดูเหมือนว่าคุณจะได้ประโยชน์จากVisual Studio 2005 เว็บการปรับใช้โครงการ s

ด้วยสิ่งนี้คุณสามารถบอกให้ปรับปรุง / แก้ไขส่วนต่างๆของไฟล์ web.config ของคุณขึ้นอยู่กับการกำหนดค่าของบิลด์

ดูบล็อกนี้จาก Scott Guเพื่อดูภาพรวม / ตัวอย่างโดยย่อ


8

เราเคยใช้โครงการ Web Deployment แต่ได้ย้ายมาที่ NAnt แทนที่จะแยกและคัดลอกไฟล์การตั้งค่าที่แตกต่างกันในปัจจุบันเราได้ฝังค่าการกำหนดค่าโดยตรงในการสร้างสคริปต์และฉีดเข้าไปในไฟล์การตั้งค่าของเราผ่านงาน xmlpoke:

  <xmlpoke
    file="${stagingTarget}/web.config"
    xpath="/configuration/system.web/compilation/@debug"
    value="true"
  />

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


7

นายจ้างปัจจุบันของฉันแก้ไขปัญหานี้โดยใส่ระดับ dev (debug, stage, live, etc) เป็นครั้งแรกในไฟล์ machine.config จากนั้นพวกเขาเขียนโค้ดเพื่อหยิบขึ้นมาและใช้ไฟล์ปรับแต่งที่เหมาะสม ที่แก้ไขปัญหาด้วยสตริงการเชื่อมต่อที่ไม่ถูกต้องหลังจากที่แอปได้รับการปรับใช้

พวกเขาเพิ่งเขียน webservice ส่วนกลางที่ส่งคืนสตริงการเชื่อมต่อที่ถูกต้องจากค่าในค่า machine.config

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


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

1
นี่คือทางออกที่น่าสนใจมาก ชอบที่จะดูตัวอย่างของการกระทำนี้
Mike K

5

หนึ่งในโซลูชันที่ใช้งานได้ดีคือการใช้ WebDeploymentProject ฉันมีไฟล์ web.config 2/3 ที่แตกต่างกันในเว็บไซต์ของฉันและที่เผยแพร่ขึ้นอยู่กับโหมดการกำหนดค่าที่เลือกไว้ (release / staging / etc ... ) ฉันจะคัดลอกบน Web.Release.config และเปลี่ยนชื่อเป็นเว็บ config ในเหตุการณ์ AfterBuild และลบรายการที่ฉันไม่ต้องการ (ตัวอย่างเช่น Web.Staging.config)

<Target Name="AfterBuild">
    <!--Web.config -->
    <Copy Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' " SourceFiles="$(SourceWebPhysicalPath)\Web.Release.config" DestinationFiles="$(OutputPath)\Web.config" />
    <Copy Condition=" '$(Configuration)|$(Platform)' == 'Staging|AnyCPU' " SourceFiles="$(SourceWebPhysicalPath)\Web.Staging.config" DestinationFiles="$(OutputPath)\Web.config" />
    <!--Delete extra files -->
    <Delete Files="$(OutputPath)\Web.Release.config" />
    <Delete Files="$(OutputPath)\Web.Staging.config" />
    <Delete Files="@(ProjFiles)" />
  </Target>

3

คุณจะพบโซลูชันอื่นได้ที่นี่: วิธีที่ดีที่สุดในการสลับการกำหนดค่าระหว่างสภาพแวดล้อมการพัฒนา / UAT / Prod ใน ASP.NET หรือไม่ ซึ่งใช้ XSLT เพื่อถ่ายโอน web.config

นอกจากนี้ยังมีตัวอย่างที่ดีเกี่ยวกับการใช้ NAnt


3

โครงการของเรามีปัญหาเดียวกันกับที่เราต้องบำรุงรักษา config สำหรับ dev, qa, uat และ prod นี่คือสิ่งที่เราติดตาม (ใช้เฉพาะในกรณีที่คุณคุ้นเคยกับ MSBuild):

ใช้ MSBuild กับส่วนขยายภารกิจ MSBuild Community ซึ่งรวมถึงงาน 'XmlMassUpdate' ที่สามารถ 'อัปเดตข้อมูลจำนวนมาก' ในไฟล์ XML ใด ๆ เมื่อคุณให้โหนดที่ถูกต้องเพื่อเริ่มต้น

ที่จะใช้:

1) คุณต้องมีไฟล์กำหนดค่าหนึ่งไฟล์ซึ่งจะมีรายการ dev env ของคุณ นี่คือไฟล์กำหนดค่าในโซลูชันของคุณ

2) คุณต้องมีไฟล์ 'Substitutions.xml' ที่มีเฉพาะรายการที่ต่างกัน (appSettings และ ConnectionStrings เป็นส่วนใหญ่) สำหรับแต่ละสภาพแวดล้อม รายการที่ไม่เปลี่ยนแปลงในสภาพแวดล้อมไม่จำเป็นต้องใส่ในไฟล์นี้ พวกเขาสามารถอาศัยอยู่ในไฟล์ web.config ของการแก้ปัญหาและจะไม่ได้สัมผัสกับงาน

3) ในไฟล์บิลด์ของคุณเพียงแค่เรียกภารกิจการอัพเดต XML จำนวนมากและจัดเตรียมสภาวะแวดล้อมที่เหมาะสมเป็นพารามิเตอร์

ดูตัวอย่างด้านล่าง:

    <!-- Actual Config File -->
    <appSettings>
        <add key="ApplicationName" value="NameInDev"/>
        <add key="ThisDoesNotChange" value="Do not put in substitution file" />
    </appSettings>

    <!-- Substitutions.xml -->
    <configuration xmlns:xmu="urn:msbuildcommunitytasks-xmlmassupdate">
      <substitutions>
        <QA>
           <appSettings>
            <add xmu:key="key" key="ApplicationName" value="NameInQA"/>
           </appSettings>            
        </QA>
        <Prod>
          <appSettings>
            <add xmu:key="key" key="ApplicationName" value="NameInProd"/>
          </appSettings>            
        </Prod>
     </substitutions>
    </configuration>


<!-- Build.xml file-->

    <Target Name="UpdateConfigSections">
            <XmlMassUpdate ContentFile="Path\of\copy\of\latest web.config" SubstitutionsFile="path\of\substitutionFile" ContentRoot="/configuration" SubstitutionsRoot="/configuration/substitutions/$(Environment)" />
        </Target>

แทนที่ '$ Environment' ด้วย 'QA' หรือ 'Prod' โดยอิงจาก env คุณกำลังสร้างเพื่อ โปรดทราบว่าคุณควรทำงานกับสำเนาของไฟล์กำหนดค่าและไม่ใช่ไฟล์กำหนดค่าจริงเพื่อหลีกเลี่ยงข้อผิดพลาดที่ไม่สามารถกู้คืนได้

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

สำหรับภาพรวมที่ดีขึ้นให้อ่านสิ่งนี้:

http://blogs.microsoft.co.il/blogs/dorony/archive/2008/01/18/easy-configuration-deployment-with-msbuild-and-the-xmlmassupdate-task.aspx


2

เช่นเดียวกับคุณฉันได้ตั้งค่า 'multi' app.config - เช่น app.configDEV, app.configTEST, app.config.LOCAL ฉันเห็นทางเลือกที่ยอดเยี่ยมที่แนะนำ แต่ถ้าคุณชอบวิธีที่เหมาะกับคุณฉันจะเพิ่มสิ่งต่อไปนี้:

ฉันมี
<appSettings>
<add key = "Env" value = "[Local] "/> สำหรับแต่ละแอปฉันเพิ่มสิ่งนี้ไปยัง UI ในแถบชื่อเรื่อง: จาก ConfigurationManager.AppSettings.Get ("Env");

ฉันเพิ่งเปลี่ยนชื่อการกำหนดค่าเป็นสิ่งที่ฉันกำหนดเป้าหมาย (ฉันมีโครงการที่มี 8 แอพที่มีฐานข้อมูลจำนวนมาก / การกำหนดค่า wcf เทียบกับ 4 Evenioments) ในการปรับใช้กับ clickonce ในแต่ละครั้งฉันจะเปลี่ยนการเลือก 4 รายการในโครงการและไป (สิ่งนี้ฉันชอบที่จะทำให้เป็นอัตโนมัติ)

gotcha เพียงอย่างเดียวของฉันคืออย่าลืม 'ล้างทั้งหมด' หลังจากการเปลี่ยนแปลงเนื่องจาก config เก่า 'ติด' หลังจากเปลี่ยนชื่อด้วยตนเอง (ซึ่งฉันคิดว่าจะแก้ไขปัญหาการตั้งค่าการตั้งค่าของคุณ)

ฉันพบว่ามันใช้งานได้ดีจริงๆ (วันหนึ่งฉันจะมีเวลาดู MSBuild / NAnt)


0

Web.config:

Web.config จำเป็นเมื่อคุณต้องการโฮสต์แอปพลิเคชันของคุณบน IIS Web.config เป็นไฟล์ปรับแต่งที่จำเป็นสำหรับ IIS เพื่อกำหนดว่ามันจะทำหน้าที่เป็น reverse proxy หน้า Kestrel ได้อย่างไร คุณต้องดูแล web.config หากคุณต้องการโฮสต์บน IIS

AppSetting.json:

สำหรับทุกสิ่งที่ไม่เกี่ยวข้องกับ IIS คุณใช้ AppSetting.json AppSetting.json ใช้สำหรับการโฮสต์ Asp.Net Core ASP.NET Core ใช้ตัวแปรสภาพแวดล้อม "ASPNETCORE_ENVIRONMENT" เพื่อกำหนดสภาพแวดล้อมปัจจุบัน โดยค่าเริ่มต้นหากคุณเรียกใช้แอปพลิเคชันของคุณโดยไม่ต้องตั้งค่านี้มันจะเริ่มต้นโดยอัตโนมัติไปยังสภาพแวดล้อมการผลิตและใช้ไฟล์ "AppSetting.production.json" เมื่อคุณทำการดีบักผ่าน Visual Studio มันจะตั้งค่าสภาพแวดล้อมเป็นการพัฒนาดังนั้นจึงใช้ "AppSetting.json" ดูเว็บไซต์นี้เพื่อทำความเข้าใจวิธีตั้งค่าตัวแปรสภาพแวดล้อมการโฮสต์บน Windows

app.config:

App.config เป็นอีกหนึ่งไฟล์การกำหนดค่าที่ใช้โดย. NET ซึ่งส่วนใหญ่จะใช้สำหรับ Windows Forms, Windows Services, แอพ Console และ WPF เมื่อคุณเริ่มต้นการโฮสต์ Asp.Net Core ของคุณผ่านทางแอปพลิเคชั่นคอนโซล


TL; DR

ตัวเลือกของไฟล์กำหนดค่าจะพิจารณาจากสภาพแวดล้อมการโฮสต์ที่คุณเลือกสำหรับบริการ หากคุณใช้ IIS เพื่อโฮสต์บริการของคุณให้ใช้ไฟล์ Web.config หากคุณใช้สภาพแวดล้อมการโฮสต์อื่นให้ใช้ไฟล์ App.config ดูที่การกำหนดค่าบริการโดยใช้เอกสารประกอบ Configuration Files และตรวจสอบการกำหนดค่าใน ASP.NET Core


0

มันระบุว่า asp.net ด้านบนดังนั้นทำไมไม่บันทึกการตั้งค่าของคุณในฐานข้อมูลและใช้แคชแบบกำหนดเองเพื่อดึงข้อมูล

เหตุผลที่เราทำเพราะง่ายกว่าสำหรับเราในการอัพเดทฐานข้อมูลอย่างต่อเนื่องมากกว่าที่จะได้รับอนุญาตให้อัพเดทไฟล์การผลิตอย่างต่อเนื่อง

ตัวอย่างของ Custom Cache:

public enum ConfigurationSection
{
    AppSettings
}

public static class Utility
{
    #region "Common.Configuration.Configurations"

    private static Cache cache = System.Web.HttpRuntime.Cache;

    public static String GetAppSetting(String key)
    {
        return GetConfigurationValue(ConfigurationSection.AppSettings, key);
    }

    public static String GetConfigurationValue(ConfigurationSection section, String key)
    {
        Configurations config = null;

        if (!cache.TryGetItemFromCache<Configurations>(out config))
        {
            config = new Configurations();
            config.List(SNCLavalin.US.Common.Enumerations.ConfigurationSection.AppSettings);
            cache.AddToCache<Configurations>(config, DateTime.Now.AddMinutes(15));
        }

        var result = (from record in config
                      where record.Key == key
                      select record).FirstOrDefault();

        return (result == null) ? null : result.Value;
    }

    #endregion
}

namespace Common.Configuration
{
    public class Configurations : List<Configuration>
    {
        #region CONSTRUCTORS

        public Configurations() : base()
        {
            initialize();
        }
        public Configurations(int capacity) : base(capacity)
        {
            initialize();
        }
        public Configurations(IEnumerable<Configuration> collection) : base(collection)
        {
            initialize();
        }

        #endregion

        #region PROPERTIES & FIELDS

        private Crud _crud; // Db-Access layer

        #endregion

        #region EVENTS
        #endregion

        #region METHODS

        private void initialize()
        {
            _crud = new Crud(Utility.ConnectionName);
        }

        /// <summary>
        /// Lists one-to-many records.
        /// </summary>
        public Configurations List(ConfigurationSection section)
        {
            using (DbCommand dbCommand = _crud.Db.GetStoredProcCommand("spa_LIST_MyConfiguration"))
            {
                _crud.Db.AddInParameter(dbCommand, "@Section", DbType.String, section.ToString());

                _crud.List(dbCommand, PopulateFrom);
            }

            return this;
        }

        public void PopulateFrom(DataTable table)
        {
            this.Clear();

            foreach (DataRow row in table.Rows)
            {
                Configuration instance = new Configuration();
                instance.PopulateFrom(row);
                this.Add(instance);
            }
        }

        #endregion
    }

    public class Configuration
    {
        #region CONSTRUCTORS

        public Configuration()
        {
            initialize();
        }

        #endregion

        #region PROPERTIES & FIELDS

        private Crud _crud;

        public string Section { get; set; }
        public string Key { get; set; }
        public string Value { get; set; }

        #endregion

        #region EVENTS
        #endregion

        #region METHODS

        private void initialize()
        {
            _crud = new Crud(Utility.ConnectionName);
            Clear();
        }

        public void Clear()
        {
            this.Section = "";
            this.Key = "";
            this.Value = "";
        }
        public void PopulateFrom(DataRow row)
        {
            Clear();

            this.Section = row["Section"].ToString();
            this.Key = row["Key"].ToString();
            this.Value = row["Value"].ToString();
        }

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