MvvmCrossでは、別のアプローチでこれに取り組みました。
SQLiteのネイティブポートを利用したかったので、 https://github.com/praeclarum/sqlite-net/のSQLite-netORMラッパーを使用したいと思いました。
したがって、PCLだけを使用する代わりに、次のことを行いました。
コードレベルでは、クライアントアプリは次のようなプラグインを使用できます。
ビジネスロジックライブラリ(PCLまたはプラットフォーム固有)では、コードでモデルオブジェクトを定義できます。
public class ListItem
{
[PrimaryKey, AutoIncrement]
public int Id { get; set; }
public string Name { get; set; }
public string WhenCreated { get; set; }
}
起動時にアプリは以下を呼び出すことができます:
Cirrious.MvvmCross.Plugins.Sqlite.PluginLoader.Instance.EnsureLoaded();
var factory = this.GetService<ISQLiteConnectionFactory>();
var connection = factory.Create("SimpleList");
connection.CreateTable<ListItem>();
次に、操作中に、コードは次のようなことを実行できます。
connection.Insert(new ListItem() { Name = TextToAdd, WhenCreated = DateTime.Now.ToString("HH:mm:ss ddd MMM yyyy") });
また
public ListItem this[int index]
{
get { return _connection.Table<ListItem>().OrderBy(_sortOrder).Skip(index).FirstOrDefault(); }
}
UI固有のコードは、プラグインのプラットフォーム固有の拡張機能を参照し、そのプラットフォーム固有の実装をIoC/DIシステムに挿入する必要があります。Droidではこれは本当に簡単です(MonoDroidは実行時にAssembly.Loadをサポートしているため)が、他のプラットフォームでは、これには次のような「ボイラープレート」コードが少し含まれます。
protected override void AddPluginsLoaders(Cirrious.MvvmCross.Platform.MvxLoaderPluginRegistry loaders)
{
loaders.AddConventionalPlugin<Cirrious.MvvmCross.Plugins.Sqlite.WinRT.Plugin>();
base.AddPluginsLoaders(loaders);
}
ノート:
現在のMvvmCrossリポジトリにはWinRTとMonoDroidSQLiteラッパーのみが含まれていますが、他のラッパー(WP *とMonoTouch)は簡単に構築できるはずです(他の人がそれらを構築したことは知っていますが、まだ貢献していません)
現在のMvvmCrossリポジトリには、WinRTの同期(非同期ではない)インターフェイスのみが含まれていますが、プライベートプロジェクトでこれを拡張したと言われていることもあります。
私は現在、プラグインをより広く使用できるように、このプラグイン構造をMvvmCrossの外部にプルするプロセスを進めています。うまくいけば、クリスマスの前にこれに関する発表を期待してください。
MvvmCrossのプラグインの詳細については、https: //speakerdeck.com/cirrious/mvvmcross-going-portableを参照してください。