Ответ 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>();