在Sqlite.net PCL中找不到SQLitePlatformIOS

3
我使用NuGet包管理器下载了这个包
示例显示:
public class SQLiteFactoryiOS : ISQLiteFactory
{
    public SQLite.Net.SQLiteConnection CreateConnection(string dbName)
    {
        var path = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), dbName);
        return new SQLite.Net.SQLiteConnection(new SQLitePlatformIOS(), path);
    }
}

我遇到的问题是无法引用SQLitePlatformIOS。 我甚至在源代码中找到了它,但我无法访问.Platform命名空间,因此无法创建SQLitePlatformIOS对象。
 using SQLite.Net; //.Platform.XamarinIOS <-- Compiler error if I try to reach this

我参考的项目是一个可移植类项目,因为在引用文件夹中有.NET Portable Subset。

项目结构如下:

iOS主项目引用示例可移植项目,示例可移植项目引用SQLite.Net-PCL。

在可移植项目中:

References
     .NET Portable Subset
     From Packages
          SQLite.Net
Packages
     SQLite.Net-PCL
Data
     Repositories
           ExampleRepository.cs

我的示例仓库是

using System;
using Example.Data.DTO;
using Example.Models.Properties;

using SQLite.Net;

namespace Example.Data.Repositories
{
    public class ExampleRepository(string dbPath)
    {
        using (var db = new SQLite.Net.SQLiteConnection(new SQLitePlatformIOS() /* Can't reference */, dbPath))
        {
             db.CreateTable<ExampleDTO>();
        }
    }
}

我会从iOS项目中调用这个类。

partial void SaveObject(NSObject sender)
{
    var objectToSave = CreateObjectFromView();
    var dbPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "Test.db3");
    var repo = new ExampleRepository(dbPath);
}

你能展示一下你的项目结构吗?如果你在分享代码,那么在 PCL 中就不需要引用 iOS 的实现。PCL 只需要知道接口即可。iOS 项目将会注入正确的实现。 - William Barbosa
好的,请给我几分钟来编辑我的问题。 - mac10688
我刚刚在我的iOS项目中添加了SQLite.Net-PCL引用,现在它能够引用平台命名空间了。嗯... - mac10688
就像我之前所说的,PCL 不需要知道 iOS 的引用,它只需要知道接口。你是否使用任何 IoC/DI 框架? - William Barbosa
我不知道根据它所关联的项目来隐藏命名空间是可能的。 - mac10688
这是在PCL中处理跨平台代码的推荐方式。 PCL使用通用接口,每个特定应用程序中实现接口的特定代码都会被使用。这样,您可以优雅地重复使用PCL,而无需检查当前平台或使用特定的hacky代码位。 - William Barbosa
2个回答

7
你找不到iOS实现的引用是因为在PCL中,你无法访问特定平台的代码。其实,你也不需要它。在PCL中,你只需要接口,具体的代码将使用DI框架注入,这样,PCL就可以使用每个平台的适当代码,而无需在运行时检查使用的平台。 这里有一个关于依赖注入如何工作的例子(甚至使用了SQLite)。

那是正确的答案。至于 DI,我正在寻找一个更好的依赖注入示例在 Xamarin iOS 中。虽然业务层使用构造函数注入很好,但我不确定控制器引用静态 AppDelegate 来获取对象是否合适。我不确定 Xamarin IoS 是否支持我正在寻找的 DI。这种 DI 允许使用 IoC 容器进行纯构造函数注入和对象生命周期管理。 - mac10688

2
是的,SQLite.Net PCL包中的.Platform命名空间已经消失了。
解决方法是从https://github.com/oysteinkrog/SQLite.Net-PCL下载源代码,然后自己构建二进制文件。为此,请在Xamarin Studio中打开该解决方案(截至我输入本文时,我使用的是5.10.3 Build 51),将模式更改为Release(不针对任何特定硬件),然后单击“Build -> Build All”。
然后在Xamarin Studio中打开您的iOS项目,在“引用”文件夹上单击右键,选择“编辑引用...”,然后单击“.Net程序集”选项卡,单击“浏览...”并浏览到刚刚构建的SQLite.Net.Platform.XamarinIOS.Unified.dll文件所在的位置。它应该在SQLite.Net-PCL-master/SQLite.Net.Platform.XamarinIOS.Unified/bin/Release 尽管这是2014年的旧帖子,但我从https://forums.xamarin.com/discussion/28916/error-while-trying-to-install-sqlite-net-platform-xamarinios-2-4-1-please-help(请参见JuhaPehkonen的2014年12月帖子)中找到了SQLite.Net PCL的GitHub链接。
在Xamarin Studio中添加引用的更多信息可以在此处找到:如何将库添加到Xamarin引用列表中

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接