ABP เป็นกรอบการพัฒนาเว็บที่ใช้ ASP.NET การตั้งค่าบันทึกและเฟรมเวิร์กก็ค่อนข้างสมบูรณ์เช่นกัน ที่นี่บรรณาธิการของช่องเทคโนโลยีใหม่จะแนะนำรายละเอียดเกี่ยวกับการกำหนดค่าพื้นฐานของการจัดการบันทึกและการจัดการการตั้งค่าในกรอบ ABP เพื่อนที่ต้องการสามารถอ้างอิงได้อย่างระมัดระวัง!
การจัดการบันทึก
ด้านเซิร์ฟเวอร์ (ด้านเซิร์ฟเวอร์)
ASP.NET Boilerplate ใช้เครื่องมือบันทึกการบันทึกสิ่งอำนวยความสะดวกของ Castle Windsor และสามารถใช้ไลบรารีคลาสบันทึกที่แตกต่างกันเช่น: log4Net, NLOG, Serilog ... และอื่น ๆ สำหรับไลบรารีคลาสล็อกทั้งหมด Castle ให้อินเทอร์เฟซทั่วไปเพื่อนำไปใช้งาน เราสามารถจัดการไลบรารีบันทึกพิเศษที่หลากหลายได้อย่างง่ายดายและง่ายต่อการแทนที่ส่วนประกอบบันทึกเมื่อธุรกิจต้องการ
หมายเหตุของนักแปล: ปราสาทคืออะไร: ปราสาทเป็นโครงการโอเพ่นซอร์สสำหรับแพลตฟอร์ม. NET จากกรอบการเข้าถึงข้อมูล ORM ไปจนถึงคอนเทนเนอร์ IOC ไปจนถึงเฟรมเวิร์ก MVC และ AOP ที่ชั้นเว็บโดยทั่วไปรวมทุกอย่างไว้ในกระบวนการพัฒนาทั้งหมด คอนเทนเนอร์ IOC ของ ASP.NET Boilerplate ถูกนำมาใช้ผ่านปราสาท
Log4Net เป็นส่วนประกอบของ Log Library ที่ได้รับความนิยมมากที่สุดภายใต้ ASP.NET เทมเพลต ASP.NET Boilerplate ยังใช้องค์ประกอบไลบรารี Log4Net Log Library อย่างไรก็ตามเราใช้การฉีดพึ่งพา Log4Net ผ่านรหัสคีย์เพียงบรรทัดเดียว (อธิบายโดยเฉพาะในไฟล์การกำหนดค่าด้านล่าง) ดังนั้นจึงเป็นเรื่องง่ายที่จะแทนที่ด้วยส่วนประกอบบันทึกของคุณเอง
รับ Logger
ไม่ว่าคุณจะเลือกส่วนประกอบไลบรารีบันทึกใดก็ตามมันจะเหมือนกันสำหรับการเข้าสู่ระบบผ่านรหัส (การร้องเรียนที่นี่อินเทอร์เฟซ Universal Ilogger ของ Castle นั้นยอดเยี่ยมจริงๆ)
มาที่หัวข้อ: (หมายเหตุของนักแปล: รหัสต่อไปนี้คือ Castle.core การวิเคราะห์ซอร์สโค้ดและการใช้งาน ABP Framework)
1. ก่อนอื่นเราต้องจัดการกับตัวบันทึกวัตถุ Logger ก่อน กรอบการทำงานของ ASP.NET Boilerplate ใช้เทคโนโลยีการฉีดพึ่งพาการพึ่งพาการฉีดพึ่งพาและเราสามารถใช้การฉีดพึ่งพาได้อย่างง่ายดายเพื่อสร้างเครื่องบันทึกวัตถุ Logger
ถัดไปมาดูกันว่า ASP.NET Boilerplate ใช้ฟังก์ชั่นการบันทึกอย่างไร:
ใช้ Castle.core.logging; // 1: เนมสเปซสำหรับการนำเข้าบันทึก, castle.core.loggingpublic คลาส taskappservice: itaskappservice {// 2: รับวัตถุ logger ผ่านการฉีดพึ่งพา ที่นี่ก่อนอื่นเรากำหนดตัวบันทึกทรัพย์สินสาธารณะของประเภท Ilogger ซึ่งเป็นวัตถุที่เราใช้ในการบันทึกบันทึก หลังจากสร้างวัตถุ TaskAppService (งานที่กำหนดไว้ในแอปพลิเคชันของเรา) มันจะถูกนำไปใช้ผ่านการฉีดแอตทริบิวต์ Public Ilogger Logger {รับ; ชุด; } Public TaskAppService () {// 3: หากไม่มีตัวบันทึกให้ส่งคืนเครื่องบันทึกไปยังอินสแตนซ์ที่ว่างเปล่าและอย่าเขียนบันทึก นี่เป็นวิธีที่ดีที่สุดในการใช้การฉีดขึ้นอยู่กับการพึ่งพา // หากคุณไม่ได้กำหนดเครื่องบันทึกที่ว่างเปล่านี้จะมีการสร้างข้อยกเว้นเมื่อเราได้รับการอ้างอิงวัตถุและสร้างอินสแตนซ์ // การทำเช่นนั้นทำให้มั่นใจได้ว่าวัตถุนั้นไม่ว่างเปล่า ดังนั้นในคำอื่น ๆ โดยไม่ต้องตั้งค่าตัวบันทึกบันทึกจะไม่ถูกบันทึกและวัตถุ null จะถูกส่งคืน // วัตถุ nulllogger ไม่มีอะไรว่างเปล่า โดยการทำเช่นนี้เท่านั้นเราสามารถตรวจสอบให้แน่ใจว่าชั้นเรียนที่เรากำหนดงานตามปกติเมื่อมีการสร้างอินสแตนซ์ logger = nulllogger.instance; } โมฆะสาธารณะ CreateTeTask (อินพุต createTaskInput) {// 4: เขียนถึง log logger.info ("การสร้างงานใหม่พร้อมคำอธิบาย:" + input.description); // TODO: บันทึกงานไปยังฐานข้อมูล ... }} การคัดลอกรหัสมีดังนี้:ข้อมูล 2014-07-13 13: 40: 23,360 [8] Simpletasksystem.tasks.taskappservice-การสร้างงานใหม่พร้อมคำอธิบาย: อย่าลืมดื่มนมก่อนนอน!
หลังจากเขียนลงในบันทึกเราสามารถดูไฟล์บันทึกได้เช่นเดียวกับรูปแบบต่อไปนี้:
การใช้เครื่องบันทึกผ่านคลาสฐานเฟรมเวิร์ก ASP.NET Boilerplate จัดเตรียมคลาสพื้นฐานของคอนโทรลเลอร์ MVC คอนโทรลเลอร์เว็บ API และคลาสบริการแอปพลิเคชัน (ตัวควบคุมและบริการแอปพลิเคชันที่คุณกำหนดจะต้องสืบทอดคลาสพื้นฐานของ ASP.NET Boilerplate ในคำอื่น ๆ คนตัดไม้)
Public Class Homecontroller: SimpleTasksystemControllerBase {ดัชนีแอ็คชั่นสาธารณะ () {logger.debug ("ข้อความบันทึกตัวอย่าง ... "); Return View (); -คำอธิบาย: SimpleTasksystemControllerBase ตัวควบคุมคลาสพื้นฐานนี้เป็นตัวควบคุมคลาสพื้นฐานที่เรากำหนดตัวเองและจะต้องสืบทอดจาก ABPController
ด้วยวิธีนี้คนบันทึกสามารถทำงานได้ตามปกติ แน่นอนคุณสามารถใช้คลาสฐานของคุณเองได้ดังนั้นคุณจึงไม่สามารถใช้การฉีดพึ่งพาได้อีกต่อไป
การกำหนดค่า
หากคุณสร้างโครงการของคุณผ่านเทมเพลต ASP.NET Boilerplate บนเว็บไซต์ทางการการกำหนดค่าทั้งหมดของ Log4Net จะถูกสร้างขึ้นโดยอัตโนมัติ
รูปแบบการกำหนดค่าเริ่มต้นมีดังนี้:
•ระดับบันทึก: ระดับการบันทึกบันทึก 5 การดีบักข้อมูลเตือนข้อผิดพลาดหรือถึงแก่ชีวิต
•วันที่และเวลา: เวลาในการเข้าสู่ระบบ
•หมายเลขเธรด: หมายเลขเธรดเมื่อมีการเขียนบันทึกแต่ละบรรทัด
•ชื่อ Logger: ชื่อของ logger มักจะเป็นชื่อคลาส
•ข้อความบันทึก: เนื้อหาบันทึกที่คุณเขียน
ไฟล์การกำหนดค่า: log4net.config มักจะอยู่ในเว็บไดเรกทอรีของโครงการ
<? xml version = "1.0" encoding = "utf-8"?> <log4net> <appender name = "RollingFilePender" type = "log4net.appender.rollingFileAppender"> <ค่าไฟล์ = "logs /logs.txt" /> value = "10" /> <maximumFilesize value = "10,000KB" /> <staticLogFileName value = "true" /> <layout type = "log4net.layout.patternlayout"> <conversionPattern value = " %-5Level % <Appender-ref ref = "RollingFileAppender" /> <level value = "debug" /> </root> <logger name = "nhibernate"> <level value = "Warn" /> </ogger> </og4net>
Log4Net เป็นส่วนประกอบของไลบรารีบันทึกที่ทรงพลังและใช้งานง่าย คุณสามารถเขียนบันทึกต่างๆเช่นการเขียนไปยังไฟล์ TXT การเขียนไปยังฐานข้อมูล ฯลฯ คุณสามารถตั้งค่าระดับบันทึกขั้นต่ำเช่นเดียวกับการกำหนดค่าข้างต้นสำหรับ nhibernate ผู้บันทึกที่แตกต่างกันเขียนบันทึกที่แตกต่างกัน ฯลฯ
สำหรับการใช้งานเฉพาะโปรดดูที่: http://logging.apache.org/log4net/release/config-examples.html
ในที่สุดในไฟล์ global.asax ของโครงการกำหนดไฟล์การกำหนดค่า log4net:
คลาสสาธารณะ mvcapplication: abpwebapplication {ป้องกันการแทนที่โมฆะ application_start (ผู้ส่งวัตถุ, eventargs e) {iocmanager.instance.ioccontainer.addfacility <loggingfacility> (f => f.uselog4net () base.application_start (ผู้ส่ง, e); -LOG4NET รหัสสองบรรทัดซึ่งเป็นส่วนประกอบการบันทึก ไลบรารี log4Net ในโครงการอยู่ในแพ็คเกจ NUGET นอกจากนี้คุณยังสามารถเปลี่ยนเป็นไลบรารีส่วนประกอบบันทึกอื่น ๆ ได้ แต่รหัสไม่จำเป็นต้องเปลี่ยน เพราะกรอบของเราใช้เครื่องบันทึกผ่านการฉีดพึ่งพา!
ฝั่งไคลเอ็นต์ (ไคลเอนต์)
ในที่สุดสิ่งที่น่าอัศจรรย์ยิ่งกว่านั้นคือคุณสามารถโทรหาคนตัดไม้ทางฝั่งไคลเอ็นต์ ในฝั่งไคลเอ็นต์เฟรมเวิร์ก ASP.NET Boilerplate มี JavaScript Log API ที่สอดคล้องกันซึ่งหมายความว่าคุณสามารถบันทึกบันทึกของเบราว์เซอร์และรหัสการใช้งานมีดังนี้:
abp.log.warn ('ข้อความบันทึกตัวอย่าง ... ');แนบ: ไคลเอนต์ JavaScript API สิ่งที่คุณต้องอธิบายที่นี่คือคุณสามารถใช้ console.log เพื่อบันทึกเอาต์พุตบนไคลเอนต์ แต่ API นี้ไม่ได้รองรับเบราว์เซอร์ทั้งหมดและอาจทำให้เกิดข้อยกเว้นกับสคริปต์ของคุณ คุณสามารถใช้ API ของเราเราปลอดภัยและคุณสามารถโอเวอร์โหลดหรือขยาย API เหล่านี้ได้
abp.log.debug ('... '); abp.log.info ('... '); abp.log.warn ('... '); abp.log.error ('... '); abp.log.fatal ('... '); abp.log.fatal ('... ');การจัดการการตั้งค่า
แนะนำ
แต่ละแอปพลิเคชันจำเป็นต้องจัดเก็บการตั้งค่าบางอย่างและใช้งานที่ไหนสักแห่งในแอปพลิเคชัน ABP Framework จัดเตรียมโครงสร้างพื้นฐานที่ทรงพลังซึ่งเราสามารถตั้งค่าบนเซิร์ฟเวอร์หรือไคลเอนต์เพื่อจัดเก็บ/รับแอปพลิเคชันการกำหนดค่าผู้เช่าและระดับผู้ใช้
การตั้งค่ามักจะถูกเก็บไว้ในฐานข้อมูล (หรือแหล่งอื่น) ซึ่งแสดงโดยโครงสร้างที่สอดคล้องกับสตริงค่าชื่อ เราสามารถแปลงค่าที่ไม่ใช่สตริงเป็นค่าสตริงสำหรับการจัดเก็บ
หมายเหตุ: เกี่ยวกับอินเทอร์เฟซ isettingstore
ในการใช้การจัดการการตั้งค่าจะต้องใช้อินเทอร์เฟซ isettingstore คุณสามารถนำไปใช้ในแบบของคุณเองและมีการใช้งานที่สมบูรณ์ในโครงการโมดูล-ศูนย์เพื่ออ้างถึง
กำหนดการตั้งค่า
คุณต้องกำหนดการตั้งค่าก่อนที่จะใช้ เฟรมเวิร์ก ABP เป็นการออกแบบแบบแยกส่วนดังนั้นโมดูลที่แตกต่างกันสามารถมีการตั้งค่าที่แตกต่างกัน ในการกำหนดการตั้งค่าของโมดูลแต่ละโมดูลควรสร้างคลาสที่ได้รับจากการตั้งค่า ตัวอย่างผู้ให้บริการตั้งค่ามีดังนี้:
คลาสสาธารณะ mysettingprovider: การตั้งค่า provider {การแทนที่สาธารณะ ienumerable <การตั้งค่า definition> getSettingDefinitions (การตั้งค่าบริบทการตั้งค่า providerContext) {กลับมาใหม่ [] {การตั้งค่าใหม่ ("SMTPSERVeraddress" SettingsCopes.Application | SettingsCopes.Tenant), การตั้งค่าใหม่ ("SitecolorPreference", "สีแดง", ขอบเขต: SettingsCopes.User, IsvisibleToclients: TRUE)}; -วิธี GetSettingDefinitions ส่งคืนวัตถุการตั้งค่า DEFINITION ตัวสร้างของคลาส SettDefinition มีพารามิเตอร์ต่อไปนี้:
•ชื่อ (จำเป็น): ต้องมีชื่อที่ไม่ซ้ำกันในระบบทั้งหมด วิธีที่ดีกว่าคือการกำหนดค่าคงที่สตริงเพื่อตั้งชื่อ
•ค่าเริ่มต้น: ตั้งค่าเริ่มต้น ค่านี้สามารถเป็นโมฆะหรือสตริงที่ว่างเปล่า
•ขอบเขต: กำหนดขอบเขตของการตั้งค่า (ดูด้านล่าง)
•ชื่อที่แสดง: สตริงที่มี localizable สำหรับการแสดงชื่อที่ตั้งไว้ใน UI ในภายหลัง
•คำอธิบาย: สตริงที่สามารถปรับได้สำหรับการแสดงคำอธิบายของการตั้งค่าใน UI ในภายหลัง
•กลุ่ม: สามารถใช้ในการตั้งค่ากลุ่ม นี่เป็นเพียงการใช้งาน UI เท่านั้นและไม่ได้สำหรับการตั้งค่าการจัดการ
• isvisibleToclient: การตั้งค่าเป็นจริงจะทำให้การตั้งค่าพร้อมใช้งานบนไคลเอนต์
หลังจากสร้างการตั้งค่า Provider เราควรลงทะเบียนโมดูลของเราในวิธี preintialize:
configuration.settings.providers.add <mysettingprovider> (); ผู้ให้บริการตั้งค่าลงทะเบียนการฉีดขึ้นอยู่กับการพึ่งพาโดยอัตโนมัติ ดังนั้นผู้ให้บริการการตั้งค่าสามารถฉีดการพึ่งพาใด ๆ (เช่นที่เก็บ) เพื่อสร้างแหล่งอื่น ๆ ของนิยามการตั้งค่า
ตั้งค่าช่วง
มีการตั้งค่าสามครั้ง (หรือระดับ) ที่กำหนดไว้ใน enum settingscopes:
•แอปพลิเคชัน: การตั้งค่าทั่วทั้งแอปพลิเคชันใช้สำหรับการตั้งค่าอิสระผู้ใช้/ผู้เช่า ตัวอย่างเช่นเราสามารถกำหนดการตั้งค่าที่เรียกว่า "SMTPSERVERDDRESS" ที่ได้รับที่อยู่ IP ของเซิร์ฟเวอร์เมื่อส่งอีเมล หากการตั้งค่านี้มีค่าเดียว (ไม่เปลี่ยนแปลงตามผู้ใช้) เราสามารถกำหนดเป็นขอบเขตแอปพลิเคชัน
•ผู้เช่า: หากแอปพลิเคชันเป็นผู้เช่าหลายคนเราสามารถกำหนดการตั้งค่าเฉพาะผู้เช่า
•ผู้ใช้: เราสามารถใช้การตั้งค่าทั่วทั้งผู้ใช้เพื่อจัดเก็บ/รับค่าตั้งค่าสำหรับผู้ใช้แต่ละคน
การตั้งค่า enum มีคุณสมบัติ Flags ดังนั้นเราสามารถกำหนดการตั้งค่าที่มีหลายขอบเขต
ช่วงการตั้งค่าเป็นลำดับชั้น ตัวอย่างเช่นหากเรากำหนดช่วงการตั้งค่าเป็น "แอปพลิเคชัน | ผู้เช่า | ผู้ใช้" และพยายามรับค่าของชุดปัจจุบัน
•เราได้รับค่าของผู้ใช้เฉพาะหากกำหนด (เขียนใหม่) ผู้ใช้
•ถ้าไม่เราจะได้รับค่าผู้เช่าที่เฉพาะเจาะจงหากกำหนด (เขียนใหม่) ผู้เช่า
•ถ้าไม่เราจะได้รับค่าของแอปพลิเคชันหากกำหนดแอปพลิเคชัน
•ถ้าไม่เราได้รับค่าเริ่มต้น
ค่าเริ่มต้นอาจเป็นโมฆะหรือสตริงที่ว่างเปล่า หากเป็นไปได้ขอแนะนำให้ระบุค่าเริ่มต้นสำหรับการตั้งค่า
รับค่าที่ตั้งไว้
หลังจากกำหนดการตั้งค่าเราสามารถรับค่าปัจจุบันบนเซิร์ฟเวอร์และไคลเอนต์
(1) ฝั่งเซิร์ฟเวอร์
isettingManager ใช้ในการตั้งค่า เราสามารถฉีดและใช้งานได้ทุกที่ในแอปพลิเคชัน IsettingManager กำหนดวิธีการหลายอย่างเพื่อรับค่าที่ตั้งไว้
วิธีที่ใช้กันมากที่สุดคือ getSettingValue (หรือ GetSettingValueAsync เป็นสายอะซิงโครนัส) มันส่งคืนค่าที่ตั้งไว้ในปัจจุบันตามช่วงเริ่มต้นแอปพลิเคชันผู้เช่าและช่วงการตั้งค่าผู้ใช้ (ตามที่อธิบายไว้ในย่อหน้าก่อนการตั้งค่า) ตัวอย่าง:
// การรับค่าบูลีน (การเรียก async) var value1 = รอการตั้งค่า mAntManager.getSetingValuEasync <bool> ("passiveUserscannotlogin"); // รับค่าสตริงGetSettingValue มีรุ่นทั่วไปและแบบอะซิงโครนัสดังที่แสดงไว้ข้างต้น นอกจากนี้ยังมีวิธีการรับรายการการตั้งค่าสำหรับผู้เช่าหรือผู้ใช้เฉพาะหรือการตั้งค่าทั้งหมดสำหรับมัน
เนื่องจาก isettingManager ถูกใช้อย่างกว้างขวางคลาสฐานเฉพาะบางส่วน (เช่น Applicationservice, Domainservice และ ABPController) มีคุณสมบัติที่เรียกว่า SettManager หากเราสืบทอดมาจากชั้นเรียนเหล่านี้ไม่จำเป็นต้องฉีดมันอย่างชัดเจน
(2) ลูกค้า
หาก isvisibleToclient ถูกตั้งค่าเป็นจริงเมื่อกำหนดการตั้งค่าคุณสามารถรับค่าปัจจุบันโดยใช้ JavaScript บนไคลเอนต์ abp.setting namespace กำหนดฟังก์ชั่นและวัตถุที่ต้องการ ตัวอย่าง:
var currentColor = abp.setting.get ("sitecolorpreference"); นอกจากนี้ยังมีวิธีการเช่น Getint และ GetBoolean คุณสามารถใช้วัตถุ abp.setting.values เพื่อรับค่าทั้งหมด โปรดทราบว่าหากคุณเปลี่ยนการตั้งค่าทางฝั่งเซิร์ฟเวอร์ไคลเอนต์จะไม่ทราบเกี่ยวกับการเปลี่ยนแปลงนี้เว้นแต่ว่าหน้าจะรีเฟรชหรือโหลดซ้ำในบางวิธีหรืออัปเดตด้วยตนเองผ่านรหัส
เปลี่ยนการตั้งค่า
ISETTINGMANAGER กำหนดการเปลี่ยนแปลงการใช้งาน FORAPPLICATIONSYNC การเปลี่ยนแปลงความสะดวกสบายและการเปลี่ยนแปลงวิธีการ FORUSERASYNC (และเวอร์ชันซิงโครนัส) เพื่อเปลี่ยนการตั้งค่าของแอปพลิเคชันผู้เช่าและผู้ใช้แยกต่างหาก
เกี่ยวกับแคช
แคชอยู่ในการจัดการการตั้งค่าฝั่งเซิร์ฟเวอร์ดังนั้นเราไม่ควรใช้คำสั่ง repository หรือฐานข้อมูลอัปเดตโดยตรงเพื่อเปลี่ยนค่าที่ตั้งไว้
ข้างต้นเป็นการแนะนำรายละเอียดเกี่ยวกับการกำหนดค่าพื้นฐานของการจัดการบันทึกและการจัดการการตั้งค่าในกรอบ ABP ที่รวบรวมโดยบรรณาธิการของช่องเทคโนโลยี Fooxin ฉันหวังว่ามันจะเป็นประโยชน์สำหรับทุกคนในการเรียนรู้ความรู้นี้ สำหรับเนื้อหาเพิ่มเติมโปรดให้ความสนใจกับช่องเทคโนโลยี Fooxin ต่อไป!