Rat*_*_Ge 15 c# sqlite portable-class-library windows-8 windows-phone-8
最近我们开始研究一个新项目,其中包括Windows 8 Metro,Windows Phone和桌面应用程序的客户端.决定使用MVVM模式作为主要架构,因为在项目之间共享ViewModel对我们来说是更可接受的解决方案.
我们决定为此目的使用可移植类库,但问题是在我们尝试添加对适当库的引用后,从Visualstudio 2012扩展库下载并安装SQLite for Windows运行时,我们根本看不到这些库.这让我们想到,在Portable类库项目中不可能使用SQLite.
也许你已经完成了一些并且知道我们实现这种功能的方式?请提供正确的方法来开发此任务,因为使用SQLite并且在开发的这个阶段具有可重用的代码非常重要
Stu*_*art 20
在MvvmCross,我们通过不同的方法解决了这个问题.
我们希望利用SQLite的本地端口,我们希望使用来自https://github.com/praeclarum/sqlite-net/的SQLite-net ORM包装器.
因此,我们所做的不是仅仅使用PCL,而是:
构建包含一组跨平台SQLite-net接口和基类的核心PCL https://github.com/slodge/MvvmCross/tree/vnext/Cirrious/Plugins/Sqlite/Cirrious.MvvmCross.Plugins.Sqlite
为每个平台构建该插件DLL的扩展/实现
使用通用DI模式和库,以便PCL和非PCL数据库客户端都知道如何加载和实例化这些插件.
在代码级别,客户端应用程序可以使用以下插件:
在业务逻辑库(PCL或特定于平台)中,代码可以定义模型对象:
public class ListItem
{
[PrimaryKey, AutoIncrement]
public int Id { get; set; }
public string Name { get; set; }
public string WhenCreated { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在启动期间,应用可以调用:
Cirrious.MvvmCross.Plugins.Sqlite.PluginLoader.Instance.EnsureLoaded();
var factory = this.GetService<ISQLiteConnectionFactory>();
var connection = factory.Create("SimpleList");
connection.CreateTable<ListItem>();
Run Code Online (Sandbox Code Playgroud)
然后在操作期间,代码可以执行以下操作:
connection.Insert(new ListItem() { Name = TextToAdd, WhenCreated = DateTime.Now.ToString("HH:mm:ss ddd MMM yyyy") });
Run Code Online (Sandbox Code Playgroud)
要么
public ListItem this[int index]
{
get { return _connection.Table<ListItem>().OrderBy(_sortOrder).Skip(index).FirstOrDefault(); }
}
Run Code Online (Sandbox Code Playgroud)
虽然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);
}
Run Code Online (Sandbox Code Playgroud)
笔记:
目前的MvvmCross repo只包含WinRT和MonoDroid SQLite包装器 - 但其他(WP*和MonoTouch)应该易于构建(我知道其他人已经构建了它们,但还没有贡献它们)
当前的MvvmCross repo只包含WinRT的同步(非异步)接口 - 但我知道有人告诉我他们已经在他们的私人项目中扩展了它.
我目前正在将这个插件结构拉到MvvmCross之外,以便插件可以更广泛地使用.希望在圣诞节前期待这个消息.
有关MvvmCross插件的更多信息,请参阅https://speakerdeck.com/cirrious/mvvmcross-going-portable
归档时间: |
|
查看次数: |
15159 次 |
最近记录: |