Подтвердить что ты не робот

Кросс-платформенная регистрация в Xamarin

Я ищу либо службу ведения журнала, такую ​​как NLog, Log4Net и т.д., которая позволит мне войти в мой Xamarin.Andriod, Xamarin.IOS и проект Xamarin.PCL. Все журналы, на которые я смотрел до сих пор, не поддерживаются в проектах PCL по разным причинам (в большинстве случаев File IO). Существуют ли какие-либо решения для поддержки регистрации в кросс-платформенной моде, включая проекты PCL? Если нет, как вы внедрили ведение журнала в PCL (шаблоны проектирования и т.д.)?

Спасибо

4b9b3361

Ответ 1

Вы хотите использовать инъекцию зависимостей, если нет регистраторов PCL. Следующее - это просто концепция (хотя она и работает) с двумя примерами реализации (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

Реализация PCL для ведения журнала базы данных с зависимостью от поставщика CRUD: https://github.com/sami1971/SimplyMobile/blob/master/Core/SimplyMobile.Core/Data/DatabaseLog.cs

Обертка поставщика CRUD для библиотеки совместимых с SQLite.Net.Async PCL (доступна для iOS, Android и WP8): https://github.com/sami1971/SimplyMobile/blob/master/Core/Plugins/Data/SimplyMobile.Data.SQLiteAsync/SQLiteAsync.cs

Обертка поставщика CRUD для ServiceStack.OrmLite(доступна для 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, конечно, было бы намного проще, поскольку у него не было никаких зависимостей:

DependencyResolver.Current.RegisterService<ILogService, LogService>();

Ответ 2

Во всех случаях нет решения с кросс-платформой. Вы можете решить эту проблему с помощью служб. Поэтому создайте интерфейс ILogging и опишите все методы, необходимые для ведения журнала. Затем выполните регистрацию, которая реализует ILogging на каждой платформе. После этого на каждой платформе на установочном регистре это

     Mvx.RegisterSingleton<ILogging >(new Logging());

после этого вы можете легко получить доступ к нему из основного проекта

    Mvx.Resolve<ILogging>();