Управление журналом
Серверная сторона (сторона сервера)
ASP.NET CoalerPlate использует инструмент ведения журнала Windsor Windsor, и может использовать различные библиотеки классов журнала, такие как: log4net, NLOG, Serilog ... и так далее. Для всех библиотек классов журнала Castle предоставляет общий интерфейс для его реализации.
Примечание переводчика: что такое Castle: Castle - это проект с открытым исходным кодом для платформы .NET, от структуры доступа к данным ORM до контейнеров IOC, до структуры MVC и AOP на веб -уровне, он в основном включает в себя все во всем процессе разработки. Контейнер IOC с шаблоном ASP.NET реализован через замок.
Log4net является наиболее популярным компонентом библиотеки журнала в рамках ASP.NET. I.
Получите регистратор
Независимо от того, какой компонент библиотеки журналов вы выберете, он тот же для регистрации через код. (Жалоба здесь, универсальный интерфейс Ilogger от Castle действительно потрясающий).
Давайте перейдем к теме: (Примечание переводчика: следующим кодом является анализ и реализацию исходного кода Castle.core и реализация структуры ABP)
1. Прежде всего, нам нужно сначала справиться с логическим регистратором объекта Logger.
Далее, давайте посмотрим, как ASP.NET Cowerplate реализует функцию ведения журнала:
Использование CASTLE.CORE.Logging; Здесь мы сначала определяем регистратор публичных свойств типа Ilogger, который является объектом, который мы используем для записи журналов. После создания объекта TaskAppService (задачи, определенной в нашем приложении), он реализуется посредством инъекции атрибутов. Public ilogger Logger {get; Это лучший способ внедрить инъекцию зависимости, // Если вы не определяете этот пустой регистратор, будет создано исключение, когда мы получаем ссылку на объект и экземпляруйте его. // Делая это гарантирует, что объект не пуст. Таким образом, другими словами, без настройки журнала, журнал не будет записан, и нулевой объект будет возвращен. // Объект Nulllogger на самом деле ничто, пусто. Только при этом мы можем гарантировать, что классы, которые мы определяем, работают обычно при создании. Logger = nulllogger.instance; }} Кода -копия выглядит следующим образом:Информация 2014-07-13 13: 40: 23,360 [8] SimpleTaskSystem.tasks.taskappService-Создание новой задачи с описанием: Не забудьте пить молоко перед сном!
После написания в журнал мы можем просмотреть файл журнала, как и в следующем формате:
Использование регистратора через базовый классСтруктура ASP.NET Boilerplate предоставляет базовые классы контроллеров MVC, контроллеров Web API и классов службы приложений (контроллер и службы приложений, которые вы определяете себя, должны унаследовать базовые классы ASP.NET Boilerplate. Другими словами, при его настройке. Контроллеры Web API, контроллеры MVC и классы службы приложений наследуют базовые классы, соответствующие структуре ASP.NET Boiler Plaper, так что вы можете напрямую использовать Logger).
Public Class HomeController: SimpleTaskSyStemControllerBase {public actionResult index () {logger.debug (образец журнала ...);Описание: SimpleTaskSyStemControllerBase Этот контроллер базового класса - контроллер базового класса, который мы определяем, и он должен наследовать от AbpController.
Таким образом, регистратор может работать нормально. Конечно, вы также можете внедрить свой собственный базовый класс, чтобы вы больше не могли использовать инъекцию зависимости.
Конфигурация
Если вы генерируете свой проект через шаблоны ASP.NET Coiperplate на официальном веб -сайте, автоматически генерируются все конфигурации log4net.
Формат конфигурации по умолчанию выглядит следующим образом:
• Уровень журнала: уровень записи журнала, 5 отладка, информация, предупреждение, ошибка или фатальный.
• Дата и время: время регистрации.
• Номер потока: номер потока, когда записана каждая строка журнала.
• Имя журнала: Имя журнала, обычно имя класса.
• Текст журнала: содержимое журнала, которое вы написали.
Файл конфигурации: log4net.config обычно расположен в веб -каталоге проекта.
<? xml version = 1.0 encoding = utf-8?> <log4net> <appender name = rollingfileappender type = log4net.appender.rollingfileapender> <value = value = logs /logs.txt /> <appendTofile value = true /> <vollingstyle value = Size /> <maxSizeROllBackUps value = 10 /> <maximumFilesize value = 10000KB /> <staticLogFilEname value = true /> <layout type = log4net.layout.patternlayout> <vorurnypattern value = %-5Level %Дата [ %-5,5thread] %-40,40Logger- %Сообщение %NewLine /> < /layout> < /appender> <root> <appender-ref ref = rollingfileAppender /> <value = value = Debug/> </root> <logger name = nhibernate> <value = value = warn/> </logger> </log4net>
Log4net-это очень мощный и простой в использовании компонент библиотеки журнала. Вы можете установить минимальный уровень журнала, как и вышеуказанная конфигурация для nhibernate. Разные регистраторы пишут разные журналы и т. Д.
Для конкретного использования, пожалуйста, см.
Наконец, в файле Global.asax проекта определите файл конфигурации log4net:
Общедоступный класс MVCapplication: AbpWebApplication {Защищенный переопределение void application_start (отправитель объекта, EventArgs E) {iocmanager.instance.ioccontainer.addfacility <loggingfacility> (f => f.uselog4net (). Сконфиг (log4net.config); отправитель, E);Несколько строк кодового вызова log4net, компонент журнала. Потому что наша структура реализует регистратор через инъекцию зависимости!
Клиентская сторона (клиент)
Наконец, что еще более удивительно, так это то, что вы также можете вызвать журналиста на стороне клиента. На стороне клиента в платформе ASP.NET BoilerPlate имеет соответствующий API журнала JavaScript, что означает, что вы можете записать журналы браузера, а код реализации выглядит следующим образом:
abp.log.warn ('образец журнала сообщения ...');Прилагается: API клиента JavaScript, что вам нужно объяснить, так это то, что вы можете использовать консоли. API, наши безопасны, и вы можете даже перегрузить или расширить эти API.
abp.log.debug ('...'); abp.log.info ('...'); abp.log.warn ('...'); abp.log.error ('...' );Управление настройками
представлять
Каждое приложение должно хранить некоторые настройки и использовать их где -то в приложении. Framework ABP обеспечивает мощную инфраструктуру, которую мы можем установить на сервере или клиенте для хранения/получения приложений, арендаторов и конфигураций на уровне пользователя.
Настройки обычно хранятся в базе данных (или другом источнике), представленной структурой, соответствующей строке name-value. Мы можем преобразовать не строгие значения в строковые значения для хранения.
Примечание: о интерфейсе isettingstore
Чтобы использовать управление параметрами, должен быть реализован интерфейс IsettingStore. Вы можете реализовать его по-своему, и в проекте Module-Zero есть полные реализации.
Определите настройки
Вы должны определить настройки перед их использованием. Framework ABP - это модульная конструкция, поэтому разные модули могут иметь разные настройки. Чтобы определить собственные настройки модуля, каждый модуль должен создать полученный класс, унаследованный от настройки Provider. Пример поставщика настройки заключается в следующем:
Общедоступный класс MySettingProvider: настройка provider {public override Ienumerable <TesidDefinition> getSettingDefinitions (ContureDefinitionProviderContext Context) {return new [] {New StenceDefinition (smtpserveraddress, 127.0.0.1), New SettingDefinition (PassiveUscanscanscapes. муравей) , новая настройка Definition ( SiteColorpreference, Red, Scopes: settingscopes.user, iSvisibletoclients: true)};Метод GetSettingDefinitions возвращает объект настроек. Конструктор класса настройки имеет следующие параметры:
• Имя (требуется): должно иметь уникальное имя во всей системе. Лучшим способом является определение строковых константов для установки имени.
• Значение по умолчанию: устанавливает значение по умолчанию. Это значение может быть нулевой или пустой строкой.
• Области: определяет область настройки (см. Ниже).
• Отображение имени: локализационная строка для дальнейшего отображения имени набора в пользовательском интерфейсе.
• Описание: локализационная строка для дальнейшего отображения описания настроек в пользовательском интерфейсе.
• Группа: может использоваться для настройки групп. Это только для использования пользовательского интерфейса и не для установки управления.
• Isvisibletoclients: настройка на True сделает настройки доступными на клиенте.
После создания настройки Provider мы должны зарегистрировать наш модуль в методе Preintialize:
Configuration.Settings.Providers.Add <MySettingProvider> (); Следовательно, поставщик настроек может вводить любые зависимости (например, репозиторий) для создания некоторого другого источника определения установки.
Установите диапазон
Есть три настройки (или уровни), определенные в переходе на FettingScopes:
• Приложение: Настройки всего приложения используются для независимых настроек пользователя/арендатора. Например, мы можем определить настройку под названием SmtpserVeraddress, который получает IP -адрес сервера при отправке электронной почты. Если этот параметр имеет одно значение (не измененное на основе пользователя), то мы можем определить его как область приложения.
• Арендатор: если приложение является мультитенантом, мы можем определить настройки, специфичные для арендатора.
• Пользователь: мы можем использовать настройки всего пользователя для хранения/получения значений установки для каждого пользователя.
У Enum FundScopes есть свойство флагов, поэтому мы можем определить настройку с несколькими областями.
Диапазон настроек иерархичен. Например, если мы определим диапазон настроек для приложения |
• Мы получаем значение конкретного пользователя, если он определяет (переписывает) пользователя.
• Если нет, мы получаем конкретное значение арендатора, если он определяет (переписывает) арендатора.
• Если нет, мы получаем значение приложения, если оно определяет приложение.
• Если нет, мы получаем значение по умолчанию.
Значение по умолчанию может быть нулевой или пустой строкой. Если возможно, рекомендуется предоставить значение по умолчанию для настроек.
Получите установленное значение
После определения настроек мы можем получить его текущее значение на сервере и клиенте.
(1) Серверная сторона
IsettingManager используется для выполнения настроек. Мы можем вводить и использовать его в любом месте приложения. IsettingManager определяет много методов, чтобы получить установленные значения.
Наиболее часто используемым методом является getSettingValue (или getSettingValueAsync - это асинхронный вызов). Он возвращает в данный момент установленное значение на основе диапазона по умолчанию, приложениям, арендаторам и настройкам пользователей (как описано в абзаце перед диапазоном настройки). пример:
// Получение логического значения (Async Call) var value1 = await sitingmanager.getSettingValueAsync <bool> (passiveUsersCannotlogin); // Получение строкового значения (sync -call2 = var manager.getSettingValue (smtpserVerddress);
GetSettingValue имеет общие и асинхронные версии, как показано выше. Есть также способы получить список настроек для конкретного арендатора или пользователя или всех настроек для него.
Поскольку широко используется IsettingManager, некоторые конкретные базовые классы (такие как ApplicationService, Domainservice и AbpController) имеют свойство под названием STANEMANER. Если мы наследуем от этих классов, нет необходимости явно вводить его.
(2) Клиент
Если Isvisibletoclients установлены на True при определении настроек, вы можете получить его текущее значение, используя JavaScript на клиенте. ABP.Seting Пространство имен определяет необходимые функции и объекты. Пример:
var currentColor = abp.setting.get (sitecolorpreference); Вы можете использовать объект abp.setting.values, чтобы получить все значения. Обратите внимание, что если вы измените настройки на стороне сервера, клиент не узнает об этом изменении, если страница не обновляется или не перезагружена каким -либо образом или не обновляется вручную через код.
Изменить настройки
IsettingManager определяет изменения в сфере hairtingtingforplicationAsync, изменения в методах изменений и изменений и изменений в методах (и синхронной версии), чтобы изменить настройки приложения, арендатора и пользователя отдельно.
О кеше
Кэш находится в управлении настройками на стороне сервера, поэтому мы не должны напрямую использовать оператор репозитория или обновления базы данных, чтобы изменить установленное значение.