إدارة السجل
جانب الخادم (جانب الخادم)
يستخدم ASP.NET Boilerplate أداة تسجيل التسجيل في Castle Windsor ، ويمكنها استخدام مكتبات فئة سجل مختلفة ، مثل: Log4Net ، NLOG ، Serilog ... وما إلى ذلك. بالنسبة لجميع مكتبات فئة السجل ، توفر Castle واجهة عامة لتنفيذها.
ملاحظة المترجم: ما هو Castle: Castle هو مشروع مفتوح المصدر لمنصة .NET ، من إطار الوصول إلى البيانات ORM إلى حاويات IOC ، إلى إطار عمل MVC و AOP في طبقة الويب ، ويشمل كل شيء في عملية التطوير بأكملها. يتم تنفيذ حاوية IOC من ASP.NET Boilerplate من خلال القلعة.
Log4Net هو مكون مكتبة السجل الأكثر شعبية تحت ASP.NET. ملف.
الحصول على المسجل
بغض النظر عن مكون مكتبة السجل الذي تختاره ، فهو نفس الشيء لتسجيله عبر الكود. (شكوى هنا ، واجهة Castle العالمية Ilogger رائعة حقًا).
دعنا نصل إلى الموضوع: (ملاحظة المترجم: الكود التالي هو تحليل رمز المصدر Castle.Core وتنفيذ إطار ABP)
1. أولاً ، نحتاج إلى التعامل مع سجل كائن المسجل أولاً.
بعد ذلك ، دعونا نلقي نظرة على كيفية تنفيذ وظيفة التسجيل ASP.NET BOALERPLATE:
باستخدام castle.core.logging ؛ هنا نحدد أولاً مسجل خاصية عامة لنوع Ilogger ، وهو الكائن الذي نستخدمه لتسجيل السجلات. بعد إنشاء كائن خدمة TaskAppService (المهمة المحددة في تطبيقنا) ، يتم تنفيذها من خلال حقن السمة. logger ilogger العامة {get ؛ هذه هي أفضل طريقة لتنفيذ حقن التبعية ، // إذا لم تحدد هذا المسجل الفارغ ، فسيتم إنشاء استثناء عندما نحصل على مرجع الكائن وتثبيته. // القيام بذلك يضمن أن الكائن ليس فارغًا. لذلك ، وبعبارة أخرى ، دون إعداد مسجل ، لن يتم تسجيل السجل ، وسيتم إرجاع كائن فارغ. // كائن nulllogger هو في الواقع لا شيء ، فارغ. فقط من خلال القيام بذلك ، يمكننا التأكد من أن الفصول الدراسية التي نحددها بشكل طبيعي عند إنشاء مثيل لها. logger = nulllogger.instance ؛ }} نسخة الكود كما يلي:INFO 2014-07-13 13: 40: 23،360 [8] SimpleTaskSystem.Tasks.TaskAppService-إنشاء مهمة جديدة مع الوصف: تذكر أن تشرب الحليب قبل النوم!
بعد الكتابة إلى السجل ، يمكننا عرض ملف السجل ، تمامًا مثل التنسيق التالي:
باستخدام المسجل عبر الفئة الأساسيةيوفر Framework ASP.NET BoilerPlate الفئات الأساسية من وحدات التحكم في MVC ، وحدات التحكم في واجهة برمجة التطبيقات ومواقع الويب ، وفئات خدمة التطبيقات (يجب أن ترث الخدمات التي تحددها بنفسك فئات أساسية من ASP.NET Boilerplate. وبعبارة أخرى ، عند تخصيصها. ترث وحدات التحكم في واجهة برمجة تطبيقات الويب ، وحدات التحكم في MVC ، وفئات خدمة التطبيقات ، الفئات الأساسية المقابلة لإطار ASP.NET Boilerplate ، حتى تتمكن من استخدام المسجل بشكل مباشر).
HomeController العام: SimpleTaskSysterBase {Public ActionResult INDEX () {logger.debug (نموذج سجل ...) ؛الوصف: SimpleTaskSystemControllerBase ، وحدة تحكم الفئة الأساسية هذه هي وحدة تحكم الفئة الأساسية التي نحددها أنفسنا ، ويجب أن ترث من AbpController.
بهذه الطريقة ، يمكن أن يعمل المسجل بشكل طبيعي. بالطبع ، يمكنك أيضًا تنفيذ فئة الأساس الخاصة بك ، لذلك لم يعد بإمكانك استخدام حقن التبعية.
إعدادات
إذا قمت بإنشاء مشروعك من خلال قوالب ASP.NET BoilerPlate على الموقع الرسمي ، يتم إنشاء جميع تكوينات log4net تلقائيًا.
تنسيق التكوين الافتراضي كما يلي:
• مستوى السجل: مستوى تسجيل السجل ، 5 تصحيح أو معلومات أو تحذير أو خطأ أو قاتلة.
• التاريخ والوقت: وقت التسجيل.
• رقم الموضوع: رقم مؤشر الترابط عند كتابة كل سطر من السجل.
• اسم المسجل: اسم المسجل ، وعادة ما يكون اسم الفصل.
• نص السجل: محتوى السجل الذي كتبته.
ملف التكوين: عادةً ما يكون log4net.config موجودًا في دليل الويب الخاص بالمشروع.
<؟ = size /> <maxSizerolbackups value = 10 /> <SaintumFileSize value = 10000kb /> <conversionpattern value = ٪-5Level ٪ Date [٪ -5.5thread] ٪ -40.40logger-٪ message ٪ newline /> </tryout> < /appender> <rout> <appender-ref Ref = RollingFileAppender /> <Level Value = Debug/> </roun> <logger name = nhibernate> <value value = warn/> </dgger> </log4net>
يعد Log4Net مكونًا قويًا للغاية وسهل الاستخدام. يمكنك تعيين الحد الأدنى لمستوى السجل ، تمامًا مثل التكوين أعلاه لـ nhibernate. Loggers مختلفون يكتبون سجلات مختلفة ، إلخ.
للاستخدام المحدد ، يرجى الرجوع إلى: http://logging.apache.org/log4net/release/config-examples.html
أخيرًا ، في ملف Global.asax للمشروع ، حدد ملف تكوين log4net:
الفئة العامة mvcapplication: abpwebapplication {محمية override void application_start (Sender Object ، eventArgs e) {iocmanager.instance.ioccontainer.addfacility <GringFacility> (f => f.uselog4net (). المرسل ، هـ) ؛هناك بعض الأسطر من Code Call Log4Net ، مكون تسجيل الدخول. لأن إطار عملنا ينفذ المسجل من خلال حقن التبعية!
جانب العميل (عميل)
أخيرًا ، الأمر الأكثر إثارة للدهشة هو أنه يمكنك أيضًا الاتصال بالمسجل على جانب العميل. على جانب العميل ، يحتوي إطار عمل ASP.NET BoilerPlate على واجهة برمجة تطبيقات JavaScript Log المقابلة ، مما يعني أنه يمكنك تسجيل سجلات المتصفح ، ورمز التنفيذ هو كما يلي:
ABP.LOG.WARN ("رسالة سجل عينة ...") ؛المرفقة: عميل JavaScript API ، ما تحتاج إلى شرحه هنا هو أنه يمكنك استخدام Console.log لإخراج سجلات العميل ، لكن واجهة برمجة التطبيقات هذه لا تدعم بالضرورة جميع المتصفحات ، وقد تتسبب في استثناءات للبرنامج النصي الخاص بك. واجهات برمجة التطبيقات ، لدينا آمنة ويمكنك حتى التحميل الزائد أو تمديد واجهات برمجة التطبيقات هذه.
abp.log.debug ('...') ؛ abp.log.info ('...') ؛ abp.log.warn ('...') ؛ abp.log.error ('...' ) ؛إدارة الإعدادات
يقدم
يحتاج كل تطبيق إلى تخزين بعض الإعدادات واستخدامها في مكان ما في التطبيق. يوفر إطار ABP بنية تحتية قوية يمكننا تعيينها على الخادم أو العميل لتخزين/الحصول على تكوينات التطبيق والمستأجر ومستوى المستخدم.
عادةً ما يتم تخزين الإعدادات في قاعدة بيانات (أو مصدر آخر) ، ممثلة بالهيكل المقابل لسلسلة قيمة الاسم. يمكننا تحويل القيم غير السلسلة إلى قيم سلسلة للتخزين.
ملاحظة: حول واجهة Isettingstore
من أجل استخدام إدارة الإعدادات ، يجب تنفيذ واجهة ISETTINGSTORE. يمكنك تنفيذها بطريقتك الخاصة ، وهناك تطبيقات كاملة في مشروع الوحدة الصفر للإشارة إلى.
تحديد الإعدادات
يجب عليك تحديد الإعدادات قبل استخدامها. إطار ABP هو تصميم وحدات ، لذلك يمكن أن تحتوي الوحدات المختلفة على إعدادات مختلفة. لتحديد الإعدادات الخاصة بالوحدة ، يجب أن تنشئ كل وحدة فئة مشتقة ورثتها من SettProvider. مثال مزود الإعداد هو كما يلي:
الطبقة العامة MySettingProvider: SettingProvider {override public ienumerable <SettingDefinition> getSettingDefinitions (SettingDefinitionProvidercontext Context) {Return New [] مستأجر) ، تحديد التعريف الجديد ( SiteColorPreference ، Red ، Scopes: SettingScopes.user ، Isvisibletoclients: true)} ؛تقوم طريقة getSettingDefinitions بإرجاع كائن الإعداد. يحتوي مُنشئ فئة SettingDefinition على المعلمات التالية:
• الاسم (مطلوب): يجب أن يكون له اسم فريد على النظام بأكمله. طريقة أفضل هي تحديد ثوابت السلسلة لتعيين الاسم.
• القيمة الافتراضية: تعيين قيمة افتراضية. يمكن أن تكون هذه القيمة لاغية أو سلسلة فارغة.
• النطاقات: يحدد نطاق الإعداد (انظر أدناه).
• اسم العرض: سلسلة قابلة للترجمة لعرض اسم المجموعة لاحقًا في واجهة المستخدم.
• الوصف: سلسلة قابلة للترجمة لعرض وصف الإعدادات في واجهة المستخدم لاحقًا.
• المجموعة: يمكن استخدامها لإعداد مجموعات. هذا فقط لاستخدام واجهة المستخدم وليس لإعداد الإدارة.
• ISVISIBLETOCLITIONS: سيؤدي الإعداد إلى TRUE إلى إتاحة الإعدادات على العميل.
بعد إنشاء SettingProvider ، يجب علينا تسجيل الوحدات النمطية الخاصة بنا في طريقة ما قبل التخصيص:
configuration.settings.providers.add <SettingProvider> () ؛ لذلك ، يمكن لمزود الإعداد ضخ أي تبعيات (مثل المستودع) لإنشاء مصدر آخر لتعريف الإعداد.
ضبط النطاق
هناك ثلاثة إعدادات (أو مستويات) محددة في التعداد: التعداد:
• التطبيق: يتم استخدام إعدادات على مستوى التطبيق للإعدادات المستقلة للمستخدم/المستأجر. على سبيل المثال ، يمكننا تحديد إعداد يسمى smtpserveraddress يحصل على عنوان IP الخاص بالخادم عند إرسال بريد إلكتروني. إذا كان لهذا الإعداد قيمة واحدة (لم يتم تغييرها بناءً على المستخدم) ، فيمكننا تحديده كنطاق تطبيق.
• المستأجر: إذا كان التطبيق متعدد المستأجرين ، فيمكننا تحديد الإعدادات الخاصة بالمستأجر.
• المستخدم: يمكننا استخدام الإعدادات على مستوى المستخدم لتخزين/الحصول على قيم تعيين لكل مستخدم.
يحتوي SettingScopes Enum على خاصية Flags ، حتى نتمكن من تحديد إعداد مع نطاقات متعددة.
نطاق الإعدادات هرمي. على سبيل المثال ، إذا حددنا نطاق الإعدادات إلى التطبيق |
• نحصل على قيمة مستخدم معين إذا كان يحدد (إعادة كتابة) المستخدم.
• إذا لم يكن الأمر كذلك ، فإننا نحصل على قيمة المستأجر المحددة إذا كان يحدد (إعادة كتابة) المستأجر.
• إذا لم يكن الأمر كذلك ، نحصل على قيمة التطبيق إذا كان يحدد التطبيق.
• إذا لم يكن كذلك ، نحصل على القيمة الافتراضية.
يمكن أن تكون القيمة الافتراضية لاغية أو سلسلة فارغة. إذا أمكن ، يوصى بتوفير قيمة افتراضية للإعدادات.
احصل على القيمة المحددة
بعد تحديد الإعدادات ، يمكننا الحصول على قيمتها الحالية على الخادم والعميل.
(1) جانب الخادم
يستخدم IsettingManager لأداء الإعدادات. يمكننا حقنها واستخدامها في أي مكان في التطبيق. يحدد IsettingManager العديد من الطرق للحصول على القيم المحددة.
الطريقة الأكثر استخدامًا هي GetSettingValue (أو GetSettingValueAsync هي مكالمة غير متزامنة). يقوم بإرجاع القيمة المحددة حاليًا بناءً على نطاق إعدادات الإعدادات الافتراضية والتطبيق والمستأجر والمستخدم (كما هو موضح في الفقرة قبل نطاق الإعداد). مثال:
// الحصول على قيمة منطقية (استدعاء Async) var value1 = Await SettingManager.GetSettingValueAsync <OloL> (السلبي UsiveUserscannotlogin) ؛ // الحصول على قيمة سلسلة (Sync Call) valual2 = settingManager.getSettingValue (smtpserveraddress) ؛
GetSettingValue لديها إصدارات عامة وغير متزامنة ، كما هو موضح أعلاه. هناك أيضًا طرق للحصول على قائمة بالإعدادات لمستأجر أو مستخدم معين أو جميع الإعدادات لذلك.
نظرًا لأن isettingmanager تستخدم على نطاق واسع ، فإن بعض فئات الأساس المحددة (مثل Applicationservice ، و Domainservice ، و AbpController) لها خاصية تسمى SettingManager. إذا ورثنا من هذه الفئات ، فليس هناك حاجة لحقنها بشكل صريح.
(2) العميل
إذا تم ضبط Isvisibletoclients على صحيح عند تحديد الإعدادات ، فيمكنك الحصول على قيمته الحالية باستخدام JavaScript على العميل. يحدد ABP.Setting مساحة الاسم الوظائف والكائنات المطلوبة. مثال:
var currentColor = abp.setting.get (SiteColorPreference) ؛ يمكنك استخدام كائن abp.setting.values للحصول على جميع القيم. لاحظ أنه إذا قمت بتغيير الإعدادات على جانب الخادم ، فلن يعرف العميل هذا التغيير ما لم يتم تحديث الصفحة أو إعادة تحميلها بطريقة أو بأخرى أو تحديثها يدويًا عبر التعليمات البرمجية.
تغيير الإعدادات
يعرّف ISETTINGMANAGER تغييرات changeStingForapplicationAsync و changeStingFortenAntAsync وطرق تغييرات altingtingforuserasync (والإصدار المتزامن) لتغيير إعدادات التطبيق والمستأجر والمستخدم بشكل منفصل.
حول ذاكرة التخزين المؤقت
تقع ذاكرة التخزين المؤقت في إدارة إعدادات من جانب الخادم ، لذلك يجب ألا نستخدم مباشرة عبارة ROPOSITORY أو DATABASE UPDATE لتغيير القيمة المحددة.