Инъекция услуги CRUD в формах Xamarin - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь поэкспериментировать с новой платформой для меня, Xamarin Forms. Основываясь на знаниях .Net Core и EF Core, я решил начать с внедрения службы Sqlite ORM (sqlite-net-pcl) в шаблон Xamarin Forms Shell, включенный в Visual Studio 2019. В этом шаблоне уже реализована служба 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);
    }
}

Затем я изменил внедренную службу в классе приложения:

public App()
{
    InitializeComponent();

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

Эта реализация правильно работает с EF Core в Xamarin Forms, но EF Core работает очень медленно, поэтому я изменил ORM (sqlite-net-pcl), и он не работает.

1 Ответ

0 голосов
/ 30 октября 2019

В документе служба зависимостей сказано:

Важно

Регистрация с использованием методов Register должна бытьвыполняется в проектах платформы, прежде чем функциональность, предоставляемая реализацией платформы, будет вызвана из общего кода.

Итак, я думаю, что вы добавили строку DependencyService.Register<SqliteDataStore>(); в неправильном месте.

Решение :

Например, в 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);
    }
}

В Android:

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());
}

Есть также документы о Хранение данных в локальной базе данных SQLite.NET и Используя SQLite.NET с Android , вы можете ссылаться.

...