ABP هو إطار تطوير الويب على أساس ASP.NET. كما أن إعدادات السجل والإطار الكاملة مكتملة نسبيًا. هنا ، سيقدم محرر قناة التكنولوجيا الجديدة بالتفصيل التكوين الأساسي لإدارة السجل وإدارة الإعداد في إطار ABP. يمكن للأصدقاء المحتاجين الرجوع إليه بعناية!
إدارة السجل
جانب الخادم (جانب الخادم)
يستخدم ASP.NET Boilerplate أداة تسجيل التسجيل في Castle Windsor ، ويمكنها استخدام مكتبات فئة سجل مختلفة ، مثل: Log4Net ، NLOG ، Serilog ... وما إلى ذلك. لجميع مكتبات فئة السجل ، توفر Castle واجهة عامة لتنفيذها. يمكننا بسهولة التعامل مع العديد من مكتبات السجلات الخاصة ، ومن السهل استبدال مكونات السجل عندما يحتاج العمل.
ملاحظة المترجم: ما هو Castle: Castle هو مشروع مفتوح المصدر لمنصة .NET ، من إطار الوصول إلى البيانات ORM إلى حاويات IOC ، إلى إطار عمل MVC و AOP في طبقة الويب ، ويشمل كل شيء في عملية التطوير بأكملها. يتم تنفيذ حاوية IOC من ASP.NET Boilerplate من خلال القلعة.
Log4Net هو مكون مكتبة السجل الأكثر شعبية ضمن ASP.NET. يستخدم قالب ASP.NET BoilerPlate أيضًا مكون مكتبة سجل Log4Net. ومع ذلك ، فإننا نقوم بتنفيذ حقن التبعية log4net من خلال سطر واحد فقط من التعليمات البرمجية الرئيسية (الموضحة على وجه التحديد في ملف التكوين أدناه). لذلك ، من السهل أيضًا استبداله بمكون السجل الخاص بك.
الحصول على المسجل
بغض النظر عن مكون مكتبة السجل الذي تختاره ، فهو نفس الشيء لتسجيله عبر الكود. (شكوى هنا ، واجهة Castle العالمية Ilogger رائعة حقًا).
دعنا نصل إلى الموضوع: (ملاحظة المترجم: الكود التالي هو تحليل رمز المصدر Castle.Core وتنفيذ إطار ABP)
1. أولاً وقبل كل شيء ، نحتاج إلى التعامل مع مسجل كائن المسجل أولاً. يستخدم إطار عمل ASP.NET BoilerPlate تقنية حقن التبعية لحقن التبعية ، ويمكننا بسهولة استخدام حقن التبعية لإنشاء مسجل كائن المسجل.
بعد ذلك ، دعونا نلقي نظرة على كيفية تنفيذ وظيفة التسجيل ASP.NET BOALERPLATE:
باستخدام castle.core.logging ؛ // 1: مساحة الاسم لاستيراد السجل ، castle.core.loggingpublic Class TaskAppService: ItaskAppService {// 2: الحصول على كائن المسجل من خلال حقن التبعية. هنا نحدد أولاً مسجل خاصية عامة لنوع Ilogger ، وهو الكائن الذي نستخدمه لتسجيل السجلات. بعد إنشاء كائن خدمة TaskAppService (المهمة المحددة في تطبيقنا) ، يتم تنفيذها من خلال حقن السمة. مسجل Ilogger العام {get ؛ تعيين؛ } Public TaskAppService () {// 3: إذا لم يكن هناك مسجل ، فقم بإرجاع المسجل إلى مثيل فارغ ولا تكتب السجل. هذه هي أفضل طريقة لتنفيذ حقن التبعية ، // إذا لم تحدد هذا المسجل الفارغ ، فسيتم إنشاء استثناء عندما نحصل على مرجع الكائن وتثبيته. // القيام بذلك يضمن أن الكائن ليس فارغًا. لذلك ، وبعبارة أخرى ، دون إعداد مسجل ، لن يتم تسجيل السجل ، وسيتم إرجاع كائن فارغ. // كائن nulllogger هو في الواقع لا شيء ، فارغ. فقط من خلال القيام بذلك ، يمكننا التأكد من أن الفصول الدراسية التي نحددها بشكل طبيعي عند إنشاء مثيل لها. logger = nulllogger.instance ؛ } public void createTask (CreateTAskInput INPUT) {// 4: اكتب إلى log logger.info ("إنشاء مهمة جديدة مع الوصف:" + input.description) ؛ // TODO: حفظ المهمة إلى قاعدة البيانات ...}} نسخة الكود كما يلي:INFO 2014-07-13 13: 40: 23،360 [8] SimpleTaskSystem.Tasks.TaskAppService-إنشاء مهمة جديدة مع الوصف: تذكر أن تشرب الحليب قبل النوم!
بعد الكتابة إلى السجل ، يمكننا عرض ملف السجل ، تمامًا مثل التنسيق التالي:
باستخدام المسجل عبر الفئة الأساسيةيوفر Framework ASP.NET BoilerPlate الفئات الأساسية من وحدات التحكم في MVC ، وحدات التحكم في واجهة برمجة تطبيقات الويب ، وفئات خدمة التطبيقات (يجب أن ترث وحدات التحكم في التطبيقات الخاصة بك ، ووحدات تحكم MVC ، وفصول خدمة ASP.NET ، وبعبارة أخرى ، عندما تتوافق مع أوجه وحدات التحكم في الويب المخصصة. استخدم المسجل).
HomeController من الفئة العامة: SimpleTaskSysterControllerBase {public ActionResult INDEX () {logger.debug ("A sample log message ...") ؛ إرجاع عرض () ؛ }}الوصف: SimpleTaskSystemControllerBase ، وحدة تحكم الفئة الأساسية هذه هي وحدة تحكم الفئة الأساسية التي نحددها أنفسنا ، ويجب أن ترث من AbpController.
بهذه الطريقة ، يمكن أن يعمل المسجل بشكل طبيعي. بالطبع ، يمكنك أيضًا تنفيذ فئة الأساس الخاصة بك ، لذلك لم يعد بإمكانك استخدام حقن التبعية.
إعدادات
إذا قمت بإنشاء مشروعك من خلال قوالب ASP.NET BoilerPlate على الموقع الرسمي ، يتم إنشاء جميع تكوينات log4net تلقائيًا.
تنسيق التكوين الافتراضي كما يلي:
• مستوى السجل: مستوى تسجيل السجل ، 5 تصحيح أو معلومات أو تحذير أو خطأ أو قاتلة.
• التاريخ والوقت: وقت التسجيل.
• رقم الموضوع: رقم مؤشر الترابط عند كتابة كل سطر من السجل.
• اسم المسجل: اسم المسجل ، وعادة ما يكون اسم الفصل.
• نص السجل: محتوى السجل الذي كتبته.
ملف التكوين: عادةً ما يكون log4net.config موجودًا في دليل الويب الخاص بالمشروع.
<؟ value = "10" /> <maximumfilesize value = "10000kb" /> <StaticLogFiLename value = "true" /> <layout type = "log4net.layout.patternlayout"> <StensionPattern value = "٪-5level ٪ date [٪ -5.5thread] ٪ -40.40logger-٪ <appender-ref ref = "rollingfileappender" /> <level value = "debug" /> </round> <logger name = "nhibernate"> <lister value = "warn" /> </togger> </log4net>
يعد Log4Net مكونًا قويًا للغاية وسهل الاستخدام. يمكنك كتابة سجلات مختلفة ، مثل الكتابة إلى ملفات TXT ، والكتابة إلى قواعد البيانات ، وما إلى ذلك. يمكنك تعيين مستوى السجل الأدنى ، تمامًا مثل التكوين أعلاه لـ NHibernate. Loggers مختلفون يكتبون سجلات مختلفة ، إلخ.
للاستخدام المحدد ، يرجى الرجوع إلى: http://logging.apache.org/log4net/release/config-examples.html
أخيرًا ، في ملف Global.asax للمشروع ، حدد ملف تكوين log4net:
الفئة العامة mvcapplication: abpwebapplication {override override void application_start (sender Object ، eventArgs e) {iocmanager.instance.ioccontainer.addfacility <GoggingFacility> (f => f.uselog4net (). BASE.APPLICATION_START (Sender ، E) ؛ }}بضعة أسطر من CODE CALL LOG4NET ، مكون التسجيل. مكتبة Log4Net في المشروع موجودة في حزمة Nuget. يمكنك أيضًا تغييره إلى مكتبات مكونات السجل الأخرى ، ولكن لا يلزم تغيير الرمز. لأن إطار عملنا ينفذ المسجل من خلال حقن التبعية!
جانب العميل (عميل)
أخيرًا ، الأمر الأكثر إثارة للدهشة هو أنه يمكنك أيضًا الاتصال بالمسجل على جانب العميل. على جانب العميل ، يحتوي إطار عمل 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.log.fatal ('...') ؛ abp.log.fatal ('...') ؛إدارة الإعدادات
يقدم
يحتاج كل تطبيق إلى تخزين بعض الإعدادات واستخدامها في مكان ما في التطبيق. يوفر إطار ABP بنية تحتية قوية يمكننا تعيينها على الخادم أو العميل لتخزين/الحصول على تكوينات التطبيق والمستأجر ومستوى المستخدم.
عادةً ما يتم تخزين الإعدادات في قاعدة بيانات (أو مصدر آخر) ، ممثلة بالهيكل المقابل لسلسلة قيمة الاسم. يمكننا تحويل القيم غير السلسلة إلى قيم سلسلة للتخزين.
ملاحظة: حول واجهة Isettingstore
من أجل استخدام إدارة الإعدادات ، يجب تنفيذ واجهة ISETTINGSTORE. يمكنك تنفيذه بطريقتك الخاصة ، وهناك تطبيقات كاملة في مشروع الوحدة الصفر للإشارة إلى.
تحديد الإعدادات
يجب عليك تحديد الإعدادات قبل استخدامها. إطار ABP هو تصميم وحدات ، لذلك يمكن أن تحتوي الوحدات المختلفة على إعدادات مختلفة. لتحديد الإعدادات الخاصة بالوحدة ، يجب أن تنشئ كل وحدة فئة مشتقة ورثتها من SettProvider. مثال مزود الإعداد هو كما يلي:
الفئة العامة mySettingProvider: SettingProvider {override public ienumerable <SettingDefinition> getSettingDefinitions (SettingDefinitionProviderContext Context) {return new [] SettingScopes.Application |. }}تقوم طريقة getSettingDefinitions بإرجاع كائن الإعداد. يحتوي مُنشئ فئة SettingDefinition على المعلمات التالية:
• الاسم (مطلوب): يجب أن يكون له اسم فريد على النظام بأكمله. طريقة أفضل هي تحديد ثوابت السلسلة لتعيين الاسم.
• القيمة الافتراضية: تعيين قيمة افتراضية. يمكن أن تكون هذه القيمة لاغية أو سلسلة فارغة.
• النطاقات: يحدد نطاق الإعداد (انظر أدناه).
• اسم العرض: سلسلة قابلة للترجمة لعرض اسم المجموعة لاحقًا في واجهة المستخدم.
• الوصف: سلسلة قابلة للترجمة لعرض وصف الإعدادات في واجهة المستخدم لاحقًا.
• المجموعة: يمكن استخدامها لإعداد مجموعات. هذا فقط لاستخدام واجهة المستخدم وليس لإعداد الإدارة.
• ISVISIBLETOCLITIONS: سيؤدي الإعداد إلى TRUE إلى إتاحة الإعدادات على العميل.
بعد إنشاء SettingProvider ، يجب علينا تسجيل الوحدات النمطية الخاصة بنا في طريقة ما قبل التخصيص:
configuration.settings.providers.add <SettingProvider> () ؛ يقوم مزود الإعداد تلقائيًا بتسجيل حقن التبعية. لذلك ، يمكن لمزود الإعداد ضخ أي تبعيات (مثل المستودع) لإنشاء مصدر آخر لتعريف الإعداد.
ضبط النطاق
هناك ثلاثة إعدادات (أو مستويات) محددة في التعداد: التعداد:
• التطبيق: يتم استخدام إعدادات على مستوى التطبيق للإعدادات المستقلة للمستخدم/المستأجر. على سبيل المثال ، يمكننا تحديد إعداد يسمى "smtpserveraddress" الذي يحصل على عنوان IP للخادم عند إرسال بريد إلكتروني. إذا كان لهذا الإعداد قيمة واحدة (لم يتم تغييرها بناءً على المستخدم) ، فيمكننا تحديده كنطاق تطبيق.
• المستأجر: إذا كان التطبيق متعدد المستأجرين ، فيمكننا تحديد الإعدادات الخاصة بالمستأجر.
• المستخدم: يمكننا استخدام الإعدادات على مستوى المستخدم لتخزين/الحصول على قيم تعيين لكل مستخدم.
يحتوي SettingScopes Enum على خاصية Flags ، حتى نتمكن من تحديد إعداد مع نطاقات متعددة.
نطاق الإعدادات هرمي. على سبيل المثال ، إذا حددنا نطاق الإعداد إلى "Application | Tenant | user" وحاول الحصول على قيمة تعيينها حاليًا ؛
• نحصل على قيمة مستخدم معين إذا كان يحدد (إعادة كتابة) المستخدم.
• إذا لم يكن الأمر كذلك ، فإننا نحصل على قيمة المستأجر المحددة إذا كان يحدد (إعادة كتابة) المستأجر.
• إذا لم يكن الأمر كذلك ، نحصل على قيمة التطبيق إذا كان يحدد التطبيق.
• إذا لم يكن كذلك ، نحصل على القيمة الافتراضية.
يمكن أن تكون القيمة الافتراضية لاغية أو سلسلة فارغة. إذا أمكن ، يوصى بتوفير قيمة افتراضية للإعدادات.
احصل على القيمة المحددة
بعد تحديد الإعدادات ، يمكننا الحصول على قيمتها الحالية على الخادم والعميل.
(1) جانب الخادم
يستخدم IsettingManager لأداء الإعدادات. يمكننا حقنها واستخدامها في أي مكان في التطبيق. يحدد IsettingManager العديد من الطرق للحصول على القيم المحددة.
الطريقة الأكثر استخدامًا هي GetSettingValue (أو GetSettingValueAsync هي مكالمة غير متزامنة). يقوم بإرجاع القيمة المحددة حاليًا بناءً على نطاق إعدادات الإعدادات الافتراضية والتطبيق والمستأجر والمستخدم (كما هو موضح في الفقرة قبل نطاق الإعداد). مثال:
// الحصول على قيمة منطقية (استدعاء Async) var value1 = Await SettingManager.GetSettingValueAsync <Oool> ("السلبي UsiveSerScannotlogin") ؛ // الحصول على قيمة سلسلة (SYNC CALL) VARALE2 = STEPTENAGER.GETSETSTETTETTENTVALUE ("SMTPServeraddress") ؛GetSettingValue لديها إصدارات عامة وغير متزامنة ، كما هو موضح أعلاه. هناك أيضًا طرق للحصول على قائمة بالإعدادات لمستأجر أو مستخدم معين أو جميع الإعدادات لذلك.
نظرًا لأن isettingmanager تستخدم على نطاق واسع ، فإن بعض فئات الأساس المحددة (مثل Applicationservice ، و Domainservice ، و AbpController) لها خاصية تسمى SettingManager. إذا ورثنا من هذه الفئات ، فليس هناك حاجة لحقنها بشكل صريح.
(2) العميل
إذا تم ضبط Isvisibletoclients على صحيح عند تحديد الإعدادات ، فيمكنك الحصول على قيمته الحالية باستخدام JavaScript على العميل. يحدد ABP.Setting مساحة الاسم الوظائف والكائنات المطلوبة. مثال:
var currentColor = abp.setting.get ("SiteColorPreference") ؛ هناك أيضًا طرق مثل Getint و GetBoolean. يمكنك استخدام كائن abp.setting.values للحصول على جميع القيم. لاحظ أنه إذا قمت بتغيير الإعدادات على جانب الخادم ، فلن يعرف العميل هذا التغيير ما لم يتم تحديث الصفحة أو إعادة تحميلها بطريقة أو بأخرى أو تحديثها يدويًا عبر التعليمات البرمجية.
تغيير الإعدادات
يعرّف ISETTINGMANAGER تغييرات changeStingForapplicationAsync و changeStingFortenAntAsync وطرق تغييرات altingtingforuserasync (والإصدار المتزامن) لتغيير إعدادات التطبيق والمستأجر والمستخدم بشكل منفصل.
حول ذاكرة التخزين المؤقت
تقع ذاكرة التخزين المؤقت في إدارة إعدادات من جانب الخادم ، لذلك يجب ألا نستخدم مباشرة عبارة ROPOSITORY أو DATABASE UPDATE لتغيير القيمة المحددة.
ما سبق هو مقدمة مفصلة للتكوين الأساسي لإدارة السجل وإدارة الإعداد في إطار ABP الذي جمعه محرر قناة Fooxin Technology. آمل أن يكون من المفيد للجميع تعلم هذه المعرفة. لمزيد من المحتوى ، يرجى الاستمرار في الانتباه إلى قناة Fooxin Technology!