การจัดการบันทึก
ด้านเซิร์ฟเวอร์ (ด้านเซิร์ฟเวอร์)
ASP.NET Boilerplate ใช้เครื่องมือบันทึกการบันทึกสิ่งอำนวยความสะดวกของ Castle Windsor และสามารถใช้ไลบรารีคลาสบันทึกที่แตกต่างกันเช่น: log4Net, NLOG, Serilog ... และอื่น ๆ สำหรับไลบรารีคลาสล็อกทั้งหมด Castle ให้อินเทอร์เฟซทั่วไปเพื่อนำไปใช้งาน
หมายเหตุของนักแปล: ปราสาทคืออะไร: ปราสาทเป็นโครงการโอเพ่นซอร์สสำหรับแพลตฟอร์ม. NET จากกรอบการเข้าถึงข้อมูล ORM ไปจนถึงคอนเทนเนอร์ IOC ไปจนถึงเฟรมเวิร์ก MVC และ AOP ที่ชั้นเว็บโดยทั่วไปรวมทุกอย่างไว้ในกระบวนการพัฒนาทั้งหมด คอนเทนเนอร์ IOC ของ ASP.NET Boilerplate ถูกนำมาใช้ผ่านปราสาท
Log4Net เป็นส่วนประกอบของ Log Library ที่ได้รับความนิยมสูงสุดภายใต้ ASP.NET . ไฟล์) ดังนั้นหากคุณต้องการแทนที่ด้วยส่วนประกอบบันทึกของคุณเองก็เป็นเรื่องง่าย
รับ Logger
ไม่ว่าคุณจะเลือกส่วนประกอบไลบรารีบันทึกใดก็ตามมันจะเหมือนกันสำหรับการเข้าสู่ระบบผ่านรหัส (การร้องเรียนที่นี่อินเทอร์เฟซ Universal Ilogger ของ Castle นั้นยอดเยี่ยมจริงๆ)
มาที่หัวข้อ: (หมายเหตุของนักแปล: รหัสต่อไปนี้คือ Castle.core การวิเคราะห์ซอร์สโค้ดและการใช้งาน ABP Framework)
1. ก่อนอื่นเราต้องจัดการกับตัวบันทึกวัตถุ Logger ก่อน
ถัดไปมาดูกันว่า ASP.NET Boilerplate ใช้ฟังก์ชั่นการบันทึกอย่างไร:
การใช้ Castle.core.logging; ที่นี่ก่อนอื่นเรากำหนดตัวบันทึกทรัพย์สินสาธารณะของประเภท Ilogger ซึ่งเป็นวัตถุที่เราใช้ในการบันทึกบันทึก หลังจากสร้างวัตถุ TaskAppService (งานที่กำหนดไว้ในแอปพลิเคชันของเรา) มันจะถูกนำไปใช้ผ่านการฉีดแอตทริบิวต์ Public Ilogger Logger {รับ; นี่เป็นวิธีที่ดีที่สุดในการใช้การฉีดขึ้นอยู่กับการพึ่งพา // หากคุณไม่ได้กำหนดเครื่องบันทึกที่ว่างเปล่านี้จะมีการสร้างข้อยกเว้นเมื่อเราได้รับการอ้างอิงวัตถุและสร้างอินสแตนซ์ // การทำเช่นนั้นทำให้มั่นใจได้ว่าวัตถุนั้นไม่ว่างเปล่า ดังนั้นในคำอื่น ๆ โดยไม่ต้องตั้งค่าตัวบันทึกบันทึกจะไม่ถูกบันทึกและวัตถุ NULL จะถูกส่งคืน // วัตถุ nulllogger ไม่มีอะไรว่างเปล่า โดยการทำเช่นนี้เท่านั้นเราสามารถตรวจสอบให้แน่ใจว่าชั้นเรียนที่เรากำหนดงานตามปกติเมื่อมีการสร้างอินสแตนซ์ logger = nulllogger.instance;} โมฆะสาธารณะ createTask (อินพุต createTaskInput) {// 4: เขียนเพื่อบันทึก logger.info (การสร้างงานใหม่พร้อมคำอธิบาย: + input.description); }} การคัดลอกรหัสมีดังนี้:ข้อมูล 2014-07-13 13: 40: 23,360 [8] Simpletasksystem.tasks.taskappservice-การสร้างงานใหม่พร้อมคำอธิบาย: อย่าลืมดื่มนมก่อนนอน!
หลังจากเขียนลงในบันทึกเราสามารถดูไฟล์บันทึกได้เช่นเดียวกับรูปแบบต่อไปนี้:
การใช้เครื่องบันทึกผ่านคลาสฐานเฟรมเวิร์ก ASP.NET Boilerplate จัดเตรียมคลาสพื้นฐานของคอนโทรลเลอร์ MVC คอนโทรลเลอร์เว็บ API และคลาสบริการแอปพลิเคชัน (ตัวควบคุมและบริการแอปพลิเคชันที่คุณกำหนดด้วยตัวเองจะต้องสืบทอดคลาสพื้นฐานของ ASP.NET Boilerplate กล่าวอีกนัยหนึ่งเมื่อคุณปรับแต่ง ตัวควบคุมเว็บ API คอนโทรลเลอร์ MVC และคลาสบริการแอปพลิเคชันทั้งหมดสืบทอดคลาสพื้นฐานที่สอดคล้องกับเฟรมเวิร์ก ASP.NET Boilerplate เพื่อให้คุณสามารถใช้เครื่องบันทึกได้โดยตรง)
Public Class Homecontroller: SimpletAsksystemControllerBase {Public ActionResult Index () {Logger.debug (ข้อความบันทึกตัวอย่าง ... );คำอธิบาย: SimpleTasksystemControllerBase ตัวควบคุมคลาสพื้นฐานนี้เป็นตัวควบคุมคลาสพื้นฐานที่เรากำหนดตัวเองและจะต้องสืบทอดจาก ABPController
ด้วยวิธีนี้คนบันทึกสามารถทำงานได้ตามปกติ แน่นอนคุณสามารถใช้คลาสฐานของคุณเองได้ดังนั้นคุณจึงไม่สามารถใช้การฉีดพึ่งพาได้อีกต่อไป
การกำหนดค่า
หากคุณสร้างโครงการของคุณผ่านเทมเพลต ASP.NET Boilerplate บนเว็บไซต์ทางการการกำหนดค่าทั้งหมดของ Log4Net จะถูกสร้างขึ้นโดยอัตโนมัติ
รูปแบบการกำหนดค่าเริ่มต้นมีดังนี้:
•ระดับบันทึก: ระดับการบันทึกบันทึก 5 การดีบักข้อมูลเตือนข้อผิดพลาดหรือถึงแก่ชีวิต
•วันที่และเวลา: เวลาในการเข้าสู่ระบบ
•หมายเลขเธรด: หมายเลขเธรดเมื่อมีการเขียนบันทึกแต่ละบรรทัด
•ชื่อ Logger: ชื่อของ logger มักจะเป็นชื่อคลาส
•ข้อความบันทึก: เนื้อหาบันทึกที่คุณเขียน
ไฟล์การกำหนดค่า: log4net.config มักจะอยู่ในเว็บไดเรกทอรีของโครงการ
<? XML เวอร์ชัน = 1.0 การเข้ารหัส = UTF-8?> <log4Net> <ชื่อ Appender = RollingFileAppender Type = log4Net.appender.rollingFileAppender> <ค่าไฟล์ = logs /logs.txt /> <ภาคผนวก = size /> <maxsizeroll รวมค่า = 10 /> <maximumFilesize value = 10,000kb /> <staticlogfileName ค่า = true /> <log4net.layout.patternlayout> <conversionPattern value = %-5LEVEL %วันที่ [ %-5.5THREAD] %-40.40LOGGER- %ข้อความ %newLine /> < /layout> < /appender> <root> debug/> </root> <logger name = nhibernate> <level value = warn/> </logger> </og4net>
Log4Net เป็นส่วนประกอบของ Log Library ที่มีประสิทธิภาพและใช้งานง่าย คุณสามารถตั้งค่าระดับบันทึกขั้นต่ำเช่นเดียวกับการกำหนดค่าข้างต้นสำหรับ 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 () ผู้ส่ง e);}}LOG4NET รหัสการโทรสองบรรทัดซึ่งเป็นส่วนประกอบการบันทึก เพราะกรอบของเราใช้เครื่องบันทึกผ่านการฉีดพึ่งพา!
ฝั่งไคลเอ็นต์ (ไคลเอนต์)
ในที่สุดสิ่งที่น่าอัศจรรย์ยิ่งกว่านั้นคือคุณสามารถโทรหาคนตัดไม้ทางฝั่งไคลเอ็นต์ ในฝั่งไคลเอ็นต์เฟรมเวิร์ก ASP.NET Boilerplate มี JavaScript Log API ที่สอดคล้องกันซึ่งหมายความว่าคุณสามารถบันทึกบันทึกของเบราว์เซอร์และรหัสการใช้งานมีดังนี้:
abp.log.warn ('ข้อความบันทึกตัวอย่าง ... ');แนบ: ไคลเอ็นต์ JavaScript API สิ่งที่คุณต้องอธิบายที่นี่คือคุณสามารถใช้ console.log เพื่อส่งออกบันทึกบนไคลเอนต์ แต่ API นี้ไม่ได้สนับสนุนเบราว์เซอร์ทั้งหมดและอาจทำให้เกิดข้อยกเว้นกับสคริปต์ของคุณ APIs เราปลอดภัยและคุณสามารถโอเวอร์โหลดหรือขยาย API เหล่านี้ได้
abp.log.debug ('... '); abp.log.info ('... '); abp.log.warn ('... '); abp.log.error ('... ' ); abp.log.fatal ('... ');การจัดการการตั้งค่า
แนะนำ
แต่ละแอปพลิเคชันจำเป็นต้องจัดเก็บการตั้งค่าบางอย่างและใช้งานที่ไหนสักแห่งในแอปพลิเคชัน ABP Framework จัดเตรียมโครงสร้างพื้นฐานที่ทรงพลังซึ่งเราสามารถตั้งค่าบนเซิร์ฟเวอร์หรือไคลเอนต์เพื่อจัดเก็บ/รับแอปพลิเคชันการกำหนดค่าผู้เช่าและระดับผู้ใช้
การตั้งค่ามักจะถูกเก็บไว้ในฐานข้อมูล (หรือแหล่งอื่น) ซึ่งแสดงโดยโครงสร้างที่สอดคล้องกับสตริงค่าชื่อ เราสามารถแปลงค่าที่ไม่ใช่สตริงเป็นค่าสตริงสำหรับการจัดเก็บ
หมายเหตุ: เกี่ยวกับอินเทอร์เฟซ isettingstore
ในการใช้การจัดการการตั้งค่าจะต้องใช้อินเทอร์เฟซ isettingstore คุณสามารถนำไปใช้ในแบบของคุณเองและมีการใช้งานที่สมบูรณ์ในโครงการโมดูล-ศูนย์เพื่ออ้างถึง
กำหนดการตั้งค่า
คุณต้องกำหนดการตั้งค่าก่อนที่จะใช้ เฟรมเวิร์ก ABP เป็นการออกแบบแบบแยกส่วนดังนั้นโมดูลที่แตกต่างกันสามารถมีการตั้งค่าที่แตกต่างกัน ในการกำหนดการตั้งค่าของโมดูลแต่ละโมดูลควรสร้างคลาสที่ได้รับจากการตั้งค่า ตัวอย่างผู้ให้บริการตั้งค่ามีดังนี้:
คลาสสาธารณะ MySettingProvider: การตั้งค่า provider {การแทนที่สาธารณะ ienumerable <SetStDefinition> GetSetTingDefinitions (การตั้งค่าบริบทการกำหนดค่าใช้จ่าย) {กลับมาใหม่ [] {การตั้งค่าใหม่ .Tenant) , การตั้งค่าใหม่ ( SitecolorPreference, Red, Scopes: SettingsCopes.user, IsvisibleToclients: TRUE)};วิธี GetSettingDefinitions ส่งคืนวัตถุการตั้งค่า DEFINITION ตัวสร้างของคลาส SettDefinition มีพารามิเตอร์ต่อไปนี้:
•ชื่อ (จำเป็น): ต้องมีชื่อที่ไม่ซ้ำกันในระบบทั้งหมด วิธีที่ดีกว่าคือการกำหนดค่าคงที่สตริงเพื่อตั้งชื่อ
•ค่าเริ่มต้น: ตั้งค่าเริ่มต้น ค่านี้สามารถเป็นโมฆะหรือสตริงที่ว่างเปล่า
•ขอบเขต: กำหนดขอบเขตของการตั้งค่า (ดูด้านล่าง)
•ชื่อที่แสดง: สตริงที่มี localizable สำหรับการแสดงชื่อที่ตั้งไว้ใน UI ในภายหลัง
•คำอธิบาย: สตริงที่สามารถปรับได้สำหรับการแสดงคำอธิบายของการตั้งค่าใน UI ในภายหลัง
•กลุ่ม: สามารถใช้ในการตั้งค่ากลุ่ม นี่เป็นเพียงการใช้งาน UI เท่านั้นและไม่ได้สำหรับการตั้งค่าการจัดการ
• isvisibleToclient: การตั้งค่าเป็นจริงจะทำให้การตั้งค่าพร้อมใช้งานบนไคลเอนต์
หลังจากสร้างการตั้งค่า Provider เราควรลงทะเบียนโมดูลของเราในวิธี preintialize:
configuration.settings.providers.add <mysettingprovider> (); ดังนั้นผู้ให้บริการการตั้งค่าสามารถฉีดการพึ่งพาใด ๆ (เช่นที่เก็บ) เพื่อสร้างแหล่งอื่น ๆ ของนิยามการตั้งค่า
ตั้งค่าช่วง
มีการตั้งค่าสามครั้ง (หรือระดับ) ที่กำหนดไว้ใน enum settingscopes:
•แอปพลิเคชัน: การตั้งค่าทั่วทั้งแอปพลิเคชันใช้สำหรับการตั้งค่าอิสระผู้ใช้/ผู้เช่า ตัวอย่างเช่นเราสามารถกำหนดการตั้งค่าที่เรียกว่า smtpserveraddress ที่ได้รับที่อยู่ 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 collancolor = abp.setting.get (sitecolorpreference); คุณสามารถใช้วัตถุ abp.setting.values เพื่อรับค่าทั้งหมด โปรดทราบว่าหากคุณเปลี่ยนการตั้งค่าทางฝั่งเซิร์ฟเวอร์ไคลเอนต์จะไม่ทราบเกี่ยวกับการเปลี่ยนแปลงนี้เว้นแต่ว่าหน้าจะรีเฟรชหรือโหลดซ้ำในบางวิธีหรืออัปเดตด้วยตนเองผ่านรหัส
เปลี่ยนการตั้งค่า
ISETTINGMANAGER กำหนดการเปลี่ยนแปลงการใช้งาน FORAPPLICATIONSYNC การเปลี่ยนแปลงความสะดวกสบายและการเปลี่ยนแปลงวิธีการ FORUSERASYNC (และเวอร์ชันซิงโครนัส) เพื่อเปลี่ยนการตั้งค่าของแอปพลิเคชันผู้เช่าและผู้ใช้แยกต่างหาก
เกี่ยวกับแคช
แคชอยู่ในการจัดการการตั้งค่าฝั่งเซิร์ฟเวอร์ดังนั้นเราไม่ควรใช้คำสั่ง repository หรือฐานข้อมูลอัปเดตโดยตรงเพื่อเปลี่ยนค่าที่ตั้งไว้