在 MvvmCross 中,我们通过不同的方法解决了这个问题。
我们想利用 SQLite 的本地端口,我们想使用来自https://github.com/praeclarum/sqlite-net/的 SQLite-net ORM 包装器
因此,我们所做的不仅仅是使用 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 和 MonoDroid SQLite 包装器 - 但其他人(WP* 和 MonoTouch)应该很容易构建(我知道其他人已经构建了它们,但尚未将它们贡献回来)
当前的 MvvmCross 存储库仅包括 WinRT 的同步(非异步)接口 - 但我再次知道人们告诉我他们已经在他们的私人项目中扩展了这个。
我目前正在将这个插件结构拉到 MvvmCross 之外,以便可以更广泛地使用插件。希望圣诞节前能有一个公告。
有关 MvvmCross 插件的更多信息,请参阅https://speakerdeck.com/cirrious/mvvmcross-going-portable