Xamarin.Andriod、Xamarin.IOS、およびXamarin.PCLプロジェクトにログインできるNLog、Log4Netなどのログユーティリティを探しています。これまで見てきたすべてのロガーは、さまざまな理由でPCLプロジェクトでサポートされていません(ほとんどがファイルIOに関連しています)。 PCLプロジェクトを含むクロスプラットフォーム方式でのロギングをサポートするために利用できるソリューションはありますか?ない場合、PCL(デザインパターンなど)へのロギングをどのように実装しましたか?
ありがとう
PCLロガーがない場合は、依存性注入を使用することをお勧めします。以下は、2つのサンプル実装(Android LogとSQLiteデータベース)を使用した概念です(ただし、機能します)。
AndroidのLogクラスに近い抽象インターフェース: https://github.com/sami1971/SimplyMobile/blob/master/Core/SimplyMobile.Core/Logging/ILogService.cs
Android固有の実装、Logクラスのラッパー: https://github.com/sami1971/SimplyMobile/blob/master/Android/SimplyMobile.Android/Logging/LogService.cs
CRUDプロバイダーに依存するデータベースロギングのPCL実装: https://github.com/sami1971/SimplyMobile/blob/master/Core/SimplyMobile.Core/Data/DatabaseLog.cs
SQLite.Net.Async PCL互換ライブラリのCRUDプロバイダーラッパー(iOSで利用可能、Android&WP8): https://github.com/sami1971/SimplyMobile/blob/master /Core/Plugins/Data/SimplyMobile.Data.SQLiteAsync/SQLiteAsync.cs
ServiceStack.OrmLiteのCRUDプロバイダーラッパー(iOSおよびAndroidで利用可能): https://github.com/sami1971/SimplyMobile/blob/master/Core/Plugins/SimplyMobile.Data.OrmLite/OrmLite.cs ==
アプリケーションレベルでは、IoCコンテナを使用して、使用するサービスを登録します。例はWP8の場合ですが、iOSおよびAndroidに使用するには、ISQLitePlatformを変更するだけで済みます。
DependencyResolver.Current.RegisterService<ISQLitePlatform, SQLitePlatformWP8>()
.RegisterService<IJsonSerializer, SimplyMobile.Text.ServiceStack.JsonSerializer>()
.RegisterService<IBlobSerializer>(t => t.GetService<IJsonSerializer>().AsBlobSerializer())
.RegisterService<ILogService>(t =>
new DatabaseLog(
new SQLiteAsync(
t.GetService<ISQLitePlatform>(),
new SQLiteConnectionString(
Path.Combine(ApplicationData.Current.LocalFolder.Path, "device.log"),
true,
t.GetService<IBlobSerializer>())
)));
Android Log-wrapperは、依存関係がないため、もちろんはるかに簡単です。
DependencyResolver.Current.RegisterService<ILogService, LogService>();
クロスプラットフォームソリューションはまったくありません。サービスを利用して解決できます。したがって、インタフェースILoggingを作成し、ロギングに必要なすべてのメソッドを記述します。次に、各プラットフォームにILoggingを実装するLoggingを実装します。その後、セットアップの各プラットフォームで登録します
Mvx.RegisterSingleton<ILogging >(new Logging());
その後、コアプロジェクトから簡単にアクセスできます
Mvx.Resolve<ILogging>();