ABPは、ASP.NETに基づくWeb開発フレームワークです。そのログとフレームワークの設定も比較的完全です。ここでは、新しいテクノロジーチャネルの編集者が、ABPフレームワークでログ管理と設定管理の基本的な構成を詳細に紹介します。困っている友達はそれを注意深く参照できます!
ログ管理
サーバー側(サーバー側)
ASP.NETボイラープレートは、キャッスルウィンザーのロギング施設ロギングツールを使用し、log4net、nlog、serilogなどのさまざまなログクラスライブラリを使用できます。すべてのログクラスライブラリについて、Castleはそれを実装するための一般的なインターフェイスを提供します。さまざまな特別なログライブラリを簡単に処理でき、ビジネスに必要な場合にログコンポーネントを簡単に交換できます。
翻訳者のメモ:キャッスルとは:キャッスルは、データアクセスフレームワークORMからIOCコンテナ、MVCフレームワーク、WebレイヤーのAOPまで、.NETプラットフォームのオープンソースプロジェクトです。基本的には、開発プロセス全体にすべてが含まれます。 ASP.NETボイラープレートのIOCコンテナは、城から実装されています。
Log4Netは、ASP.NETの下で最も人気のあるログライブラリコンポーネントです。 ASP.NETボイラープレートテンプレートは、log4Netログライブラリコンポーネントも使用します。ただし、キーコードの1行だけを介してLog4Net依存関係インジェクションを実装します(以下の構成ファイルで具体的に説明しています)。したがって、独自のログコンポーネントに置き換えることも簡単です。
ロガーを取得します
選択したログライブラリコンポーネントに関係なく、コードをログインする場合も同じです。 (ここの苦情、CastleのUniversal Iloggerインターフェイスは本当に素晴らしいです)。
トピックにアクセスしましょう:(翻訳者の注:次のコードはcaster.coreソースコード分析とABPフレームワークの実装です)
1.まず、最初にロガーオブジェクトロガーに対処する必要があります。 ASP.NETボイラープレートフレームワークは、依存関係噴射依存関係噴射テクノロジーを使用し、依存関係噴射を使用してロガーオブジェクトロガーを生成することができます。
次に、ASP.NETボイラープレートがロギング機能をどのように実装するかを見てみましょう。
castle.core.loggingを使用しています。 // 1:ログをインポートするための名前空間、castle.core.loggingpublic class taskappservice:itaskappservice {// 2:依存関係インジェクションを介してロガーオブジェクトを取得します。ここでは、最初にiloggerタイプの公共財産ロガーを定義します。これは、ログを記録するために使用するオブジェクトです。 TaskAppServiceオブジェクト(アプリケーションで定義されているタスク)を作成した後、属性インジェクションを通じて実装されます。 public ilogger logger {get;セット; } public TaskAppService(){// 3:ロガーがない場合は、ロガーを空のインスタンスに戻し、ログを書き込みません。これは、この空のロガーを定義しない場合、依存関係の注入を実装する最良の方法です。オブジェクト参照を取得してインスタンス化すると、例外が生成されます。 //そうなことは、オブジェクトが空でないことを保証します。したがって、言い換えれば、ロガーをセットアップすることなく、ログは記録されず、nullオブジェクトが返されます。 // nullloggerオブジェクトは実際には何もない、空です。これを行うことによってのみ、定義するクラスがインスタンス化されたときに正常に機能することを保証できます。 logger = nulllogger.instance; } public void createTask(createTaskInput input){// 4:log logger.infoに書き込みます( "説明を使用した新しいタスクの作成:" + input.description); // todo:タスクをデータベースに保存...}}コードコピーは次のとおりです。情報2014-07-13 13:40:23,360 [8] simpletasksystem.tasks.taskappservice-説明付きの新しいタスクの作成:寝る前に牛乳を飲むことを忘れないでください!
ログに書き込みた後、次の形式と同じように、ログファイルを表示できます。
ベースクラスを介してロガーを使用しますASP.NETボイラープレートフレームワークは、MVCコントローラー、Web APIコントローラー、およびアプリケーションサービスクラスのベースクラスを提供します(定義するコントローラーとアプリケーションサービスは、ASP.NETボイラープレートのベースクラスを継承する必要があります。つまり、カスタマイズされたWeb APIコントローラー、MVCコントローラー、およびアプリケーションサービスクラスがASP.NETボイレンプレートフレームに対応するベースクラスに対応するベースクラスを継承する場合。
Public Class HomeController:SimpleTasksystemControllerBase {public ActionResult index(){logger.debug( "a sample log message ..."); return View(); }}説明:SimpleTaskSystemControllerBaseこのベースクラスコントローラーは、自分自身を定義するベースクラスコントローラーであり、ABPControllerから継承する必要があります。
このようにして、ロガーは正常に機能します。もちろん、独自のベースクラスを実装することもできます。そのため、依存関係噴射を使用できなくなります。
構成
公式WebサイトでASP.NETボイラープレートテンプレートを介してプロジェクトを生成すると、log4Netのすべての構成が自動的に生成されます。
デフォルトの構成形式は次のとおりです。
•ログレベル:ログ記録レベル、5デバッグ、情報、ワーン、エラー、または致命的。
•日付と時刻:ロギング時間。
•スレッド番号:ログの各行が書かれているときのスレッド番号。
•ロガー名:ロガーの名前、通常はクラス名。
•ログテキスト:書いたログコンテンツ。
構成ファイル:log4net.configは通常、プロジェクトのWebディレクトリにあります。
<?xml version = "1.0" encoding = "utf-8"?> <log4net> <appender name = "rollingfileappender" type = "log4net.appender.appender.appender.appender.appender.appender.appender.appender.appender.appender.appender.appender.appender. logs /logs /logs.txt" />> <auppontofile値/> <MaximumFilesize Value = "10000kb" /> <staticlogfilename value = "true" /> <layout type = "log4net.layout.patternlayout"> <conventionPattern値= "% - 5level%date [%-5.5thread]%-40.40logger -logger-%mession ref = "RollingFileAppender" /> <level value = "debug" /> < /root> <logger name = "nhibernate"> <level value = "Warn" /> < /logger> < /log4net>
log4netは、非常に強力で使いやすいログライブラリコンポーネントです。 TXTファイルへの書き込み、データベースへの書き込みなど、さまざまなログを書き込むことができます。Nhibernateの上記の構成と同様に、最小ログレベルを設定できます。異なるロガーは、異なるログなどを書き込みます。
特定の使用については、http://logging.apache.org/log4net/release/config-examples.htmlを参照してください
最後に、プロジェクトのglobal.asaxファイルで、log4net構成ファイルを定義します。
パブリッククラスMVCAPPLICATION:abpWeBApplication {Protected Override void application_start(object sender、eventargs e){iocmanager.instance.ioccontainer.addfacility <loggingfacility>(f => f.uselog4net()。 base.Application_start(sender、e); }}数行のコードがlog4net、ロギングコンポーネントを呼び出します。プロジェクトのlog4netライブラリは、Nugetパッケージにあります。他のログコンポーネントライブラリに変更することもできますが、コードを変更する必要はありません。なぜなら、私たちのフレームワークは、依存関係噴射を通じてロガーを実装しているからです!
クライアント側(クライアント)
最後に、さらに驚くべきことは、クライアント側のロガーを呼び出すこともできることです。クライアント側では、ASP.NETボイラープレートフレームワークには対応するJavaScriptログAPIがあります。これは、ブラウザのログを記録できることを意味し、実装コードは次のとおりです。
abp.log.warn( 'サンプルログメッセージ...');
添付:クライアントJavaScript API。ここで説明する必要があるのは、Console.logを使用してクライアントにログを出力できることですが、このAPIは必ずしもすべてのブラウザをサポートするわけではなく、スクリプトに例外を引き起こす可能性があります。 APIを使用できます。私たちのAPIは安全であり、これらのAPIを過負荷または拡張することもできます。
abp.log.debug( '...'); abp.log.info( '...'); abp.log.warn( '...'); abp.log.error( '...'); abp.log.fatal( '...'); abp.log.fatal( '...');
設定管理
導入
各アプリケーションは、いくつかの設定を保存し、アプリケーションのどこかに使用する必要があります。 ABPフレームワークは、アプリケーション、テナント、ユーザーレベルの構成を保存/取得するためにサーバーまたはクライアントに設定できる強力なインフラストラクチャを提供します。
設定は通常、データベース(または別のソース)に保存され、名前値文字列に対応する構造で表されます。ストレージのために、非弦の値を文字列値に変換できます。
注:IsettingStoreインターフェイスについて
設定管理を使用するには、IsettingStoreインターフェイスを実装する必要があります。独自の方法で実装でき、参照するモジュールゼロプロジェクトには完全な実装があります。
設定を定義します
使用する前に設定を定義する必要があります。 ABPフレームワークはモジュラー設計であるため、さまざまなモジュールが異なる設定を持つことができます。モジュール自身の設定を定義するには、各モジュールがSettingProviderから継承された派生クラスを作成する必要があります。セットアッププロバイダーの例は次のとおりです。
パブリッククラスMySettingProvider:SettingProvider {public Override iEnumerable <sittingDefinition> getSettingDefinitions(SettingDefinitionProviderContext Context){return new [] {new SettingDefinition( "Smtpserveraddress"、 "127.0.0.0.0.0.1")スコープ:settingscopes.application |。 }}getSetTingDefinitionsメソッドは、設定デフィニッションオブジェクトを返します。 SettingDefinitionクラスのコンストラクターには、次のパラメーターがあります。
•名前(必須):システム全体に一意の名前が必要です。より良い方法は、名前を設定するために文字列定数を定義することです。
•デフォルト値:デフォルト値を設定します。この値は、nullまたは空の文字列にすることができます。
•スコープ:設定の範囲を定義します(以下を参照)。
•表示名:後でUIにセット名を表示するためのローカライズ可能な文字列。
•説明:UIの設定の説明を後で表示するためのローカライズ可能な文字列。
•グループ:グループをセットアップするために使用できます。これはUIの使用のみであり、管理を設定するためではありません。
•ISVisibletoClients:Trueに設定すると、設定がクライアントで利用可能になります。
SettingProviderを作成した後、Preintializeメソッドにモジュールを登録する必要があります。
configuration.settings.providers.add <mysettingProvider>();設定プロバイダーは、依存関係のインジェクションを自動的に登録します。したがって、セットアッププロバイダーは、依存関係(リポジトリなど)を挿入して、セットアップ定義の他のソースを生成できます。
範囲を設定します
settingscopes enumで定義されている3つの設定(またはレベル)があります。
•アプリケーション:アプリケーション全体の設定は、ユーザー/テナントの独立設定に使用されます。たとえば、電子メールを送信するときにサーバーのIPアドレスを取得する「smtpserveraddress」という設定を定義できます。この設定に単一の値がある場合(ユーザーに基づいて変更されていません)、アプリケーションスコープとして定義できます。
•テナント:アプリケーションがマルチテナントの場合、テナント固有の設定を定義できます。
•ユーザー:ユーザー全体の設定を使用して、各ユーザーの設定値を保存/取得できます。
SettingScopes EnumにはFlagsプロパティがあるため、複数のスコープを使用した設定を定義できます。
設定範囲は階層的です。たとえば、設定範囲を「アプリケーション|テナント|ユーザー」に定義し、現在設定されている値を取得しようとする場合。
•特定のユーザーがユーザーを定義する(書き直す)場合、特定のユーザーの値を取得します。
•そうでない場合は、テナントが定義(書き直す)場合に特定のテナント値を取得します。
•そうでない場合は、アプリケーションを定義する場合、アプリケーションの値を取得します。
•そうでない場合は、デフォルト値を取得します。
デフォルト値は、nullまたは空の文字列にすることができます。可能であれば、設定にデフォルト値を提供することをお勧めします。
設定値を取得します
設定を定義した後、サーバーとクライアントで現在の値を取得できます。
(1)サーバー側
IsettingManagerは、設定を実行するために使用されます。アプリケーションのどこにでも注入して使用できます。 IsettingManagerは、設定された値を取得する多くの方法を定義します。
最も一般的に使用される方法は、getSettingValueです(またはgetSettingValueAsyncは非同期呼び出しです)。デフォルト、アプリケーション、テナント、およびユーザー設定範囲に基づいて現在設定された値を返します(設定前の段落で説明されているように)。例:
//ブール値を取得する(async call)var value1 = await sitedmanager.getSettingValueAsync <Bool>( "passiveuserscannotlogin"); //文字列値を取得する(同期)var value2 = settingmanager.getsettingValue( "smtpserveraddress");
GetSettingValueには、上記のように、一般的な非同期バージョンがあります。特定のテナントまたはユーザーの設定のリスト、またはそのすべての設定を取得する方法もあります。
IsettingManagerは広く使用されているため、一部の特定のベースクラス(Applicationservice、Domainservice、ABPControllerなど)には、SettingManagerというプロパティがあります。これらのクラスを継承する場合、明示的に注入する必要はありません。
(2)クライアント
設定を定義するときにisvisibletoclientsがtrueに設定されている場合、クライアントのJavaScriptを使用して現在の値を取得できます。 ABP。名前空間をセットすると、必要な関数とオブジェクトが定義されます。例:
var currentColor = abp.setting.get( "SiteColorPreference"); GetIntやGetBooleanなどの方法もあります。 ABP.Setting.Valuesオブジェクトを使用して、すべての値を取得できます。サーバー側の設定を変更した場合、ページが何らかの方法で更新またはリロードされたり、コードを介して手動で更新されたりしない限り、クライアントはこの変更について知らないことに注意してください。
設定を変更します
ISETTINGMANAGERは、アプリケーションの変更の変化を定義し、ForturtenantAsyncを変更し、セットセットセットセットセラシンクソート(および同期バージョン)を使用して、アプリケーション、テナント、およびユーザーの設定を個別に変更します。
キャッシュについて
キャッシュはサーバー側の設定管理にあるため、設定値を変更するためにリポジトリまたはデータベースの更新ステートメントを直接使用しないでください。
上記は、Fooxin Technology Channelの編集者がコンパイルしたABPフレームワークのログ管理と設定管理の基本的な構成の詳細な紹介です。誰もがこの知識を学ぶことが役立つことを願っています。その他のコンテンツについては、引き続きフォーキシンテクノロジーチャネルに注意を払います。