【问题标题】:Injection of CRUD service in Xamarin Forms在 Xamarin Forms 中注入 CRUD 服务
【发布时间】:2020-02-25 08:03:24
【问题描述】:

我尝试为我尝试新平台 Xamarin Forms。基于 .Net Core 和 EF Core 知识,我决定首先在 Visual Studio 2019 中包含的 Xamarin Forms Shell 模板中注入 Sqlite ORM 服务 (sqlite-net-pcl)。在此模板中,已经实现了基于 in- 的 Mock CRUD 服务内存数据结构,所以我想实现自己的服务并用 DependencyService 注入它。 起初我修改了需要属性的数据模型:

public class Item
{
    [PrimaryKey, AutoIncrement]
    public string Id { get; set; }
    public string Text { get; set; }
    public string Description { get; set; }
}

接下来我实现了 CRUD 服务:

public class SqliteDataStore : IDataStore<Item>
{
    private readonly SQLiteConnection _db;

    public SqliteDataStore()
    {
        _db = new SQLiteConnection(Path.Combine(FileSystem.AppDataDirectory, "items.sqlite"));
        _db.CreateTable<Item>();
        if (_db.Table<Item>().Count().Equals(0))
        {
            _db.InsertAll(new List<Item>
            {
                new Item { Id = Guid.NewGuid().ToString(), Text = "First item", Description = "This is the first item description." },
                new Item { Id = Guid.NewGuid().ToString(), Text = "Second item", Description = "This is the second item description." },
                new Item { Id = Guid.NewGuid().ToString(), Text = "Third item", Description = "This is the third item description." }
            }
            );
        }
    }

    public async Task<bool> AddItemAsync(Item item)
    {
        _db.Insert(item);
        return await Task.FromResult(true);
    }

    public async Task<bool> DeleteItem(string id)
    {
        _db.Delete<Item>(id);
        return await Task.FromResult(true);
    }

    public async Task<Item> GetItemAsync(string id)
    {
        return await Task.FromResult(_db.Get<Item>(id));
    }

    public async Task<IEnumerable<Item>> GetItemsAsync(bool forceRefresh = false)
    {
        return await Task.FromResult(_db.Table<Item>().ToList());
    }

    public async Task<bool> UpdateItemAsync(Item item)
    {
        _db.Update(item);
        return await Task.FromResult(true);
    }
}

接下来我在 App 类中更改了注入服务:

public App()
{
    InitializeComponent();

    DependencyService.Register<SqliteDataStore>();
    MainPage = new AppShell();
}

此实现在 Xamarin Forms 中与 EF Core 一起正常工作,但 EF Core 非常慢,所以我更改了 ORM (sqlite-net-pcl),但它不起作用。

【问题讨论】:

    标签: sqlite xamarin.forms dependency-injection sqlite-net-pcl


    【解决方案1】:

    dependency servicee的文档中说:

    重要

    必须在平台中使用Register 方法注册 项目,在平台提供的功能之前 从共享代码调用实现。

    所以,我认为您在错误的地方添加了DependencyService.Register&lt;SqliteDataStore&gt;(); 行。

    解决方案

    例如,在 iOS 中应该是:

    [Register("AppDelegate")]
    public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
    {
        public override bool FinishedLaunching(UIApplication app, NSDictionary options)
        {
            global::Xamarin.Forms.Forms.Init();
            LoadApplication(new App());
    
            DependencyService.Register<SqliteDataStore>();
    
            return base.FinishedLaunching(app, options);
        }
    }
    

    在安卓中:

    protected override void OnCreate(Bundle savedInstanceState)
    {
        TabLayoutResource = Resource.Layout.Tabbar;
        ToolbarResource = Resource.Layout.Toolbar;
    
        base.OnCreate(savedInstanceState);
    
        DependencyService.Register<SqliteDataStore>();
    
    
        Xamarin.Essentials.Platform.Init(this, savedInstanceState);
        global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
        LoadApplication(new App());
    }
    

    还有关于Store Data in a Local SQLite.NET DatabaseUsing SQLite.NET with Android的文档可以参考。

    【讨论】:

    • 正如我所提到的,我已经使用 EF Core 实现了这个并且它可以工作,但是 EF Core 对于移动应用程序来说太“重”了。注册可以通过方法或属性来完成。属性注册只能用于注册平台特定的实现。在文档中使用了“CAN”一词。不是“必须”。明天我将清理我的 EF Core 解决方案,将其发布到 github 并在此处粘贴链接
    • @MarekSłowikowski 是的,但我没有看到您在 DependencyService 中使用的属性注册。让我试试你的代码,稍后我会更新你。
    • @MarekSłowikowski 我只是测试了你的代码,这一切都在我这边运行良好。我唯一更改的是将 Id 更改为 int 类型。我上传了一个示例项目here,您可以查看。让我知道它是否适合您。
    • 谢谢。看来我不够细心。 “看大事,看不到细节”。
    • 是的,在您的帮助下。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 2016-08-25
    • 2015-01-04
    • 2016-11-24
    • 1970-01-01
    相关资源
    最近更新 更多