Лучшие практики Mvvm Light и Entity Framework Core

Я создаю новое приложение UWP, используя Mvvm Light и Entity Framework Core. Я новичок в этих двух технологиях.

Я создаю свою модель: класс Article представляет собой простой ObservableObject с тремя свойствами: Id, Reférence и Désignation.

Мой DbContext следующий:

public class UniversalTest1Context : DbContext
{
    public DbSet<Article> Articles { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlite("Filename=UniversalTest1.db");
    }

}

Я ищу лучший способ управления DbContext и моими различными представлениями.

Лучше ли создать один DbContext для всего приложения? Мне не очень нравится эта идея.

Должен ли я создавать DbContext в каждой ViewModel? Мне так больше нравится.
Когда пользователь дважды нажимает элемент в представлении списка статей, я перехожу к представлению сведений о статье и передаю статью в модель представления, связанную с представлением сведений о статье. Но эта уже существующая статья не связана с DbContext модели подробного представления статьи.

Можно ли создавать экземпляр DbContext только при необходимости? Мой предпочтительный вариант.
Для этого я передаю статью из модели представления списка в модель представления сведений. И затем, когда пользователь нажимает «Сохранить», я выполняю что-то вроде этого:

using (var db = new UniversalTest1Context())
{
    db.Articles.Add(article);
    await db.SaveChangesAsync();
}

Конечно, это работает для новых статей (вставка), но не для существующих (обновление).

У меня есть трудности с принятием решения здесь.

Заранее большое спасибо, Жюльен.


person Julien Ferraro    schedule 27.06.2016    source источник
comment
Я бы посмотрел CQRS и Mediatr. Вы должны создавать экземпляр каждый раз, когда используете его, потому что каждый экземпляр — это единица работы.   -  person Callum Linington    schedule 27.06.2016
comment
Каллум, в таком случае, как я могу передать статью, отредактированную на мой взгляд, в новый DbContext, чтобы ее можно было сохранить в базе данных?   -  person Julien Ferraro    schedule 27.06.2016
comment
Если вы читали о MediatR, вы создаете то, что называется class SaveArticleRequest : IRequest<Article> Затем это отправляется в MediatR с использованием mediator.SendAsync(new SaveArticleRequest(article)); Таким образом, вы создаете только очень нишевые (SRP) классы, которые имеют дело с одной вещью. Это означает, что вы можете составить свою систему с большой детализацией. ИМХО замечательная схема.   -  person Callum Linington    schedule 27.06.2016
comment
Опубликуйте код viewModel в своем вопросе, и я создам вам ответ, используя CQRS.   -  person Callum Linington    schedule 27.06.2016
comment
@JulienFerraro, если вы хотите создать большое сложное приложение, я советую вам использовать для этого PRISM. Если вы создаете что-то очень маленькое, вы можете использовать все, что захотите.   -  person tym32167    schedule 28.06.2016


Ответы (1)


На мой взгляд, вы должны скрыть все операции хранения по интерфейсу (например, IArticleRepo или что-то в этом роде), и вы должны использовать IoC для доступа к нему (если какой-то класс хочет работать с Store, он должен объявить IArticleRepo в параметрах ctor). Кроме того, внутри этого интерфейса IArticleRepo вы можете выполнять необходимые операции со статьями, например IArticleRepo.AddArticle(Article a). Если вы это сделаете, вы можете выбрать позже, хотите ли вы создать dbcontext для каждой операции или нет, ИЛИ, возможно, вы хотите сделать реализацию IArticleRepo как однотонную, используя контейнер IoC. Но такие решения не должны влиять на остальной код. Как очень простой пример в моем коде (я показываю только этот файл, весь проект уродлив, и я его изменю) https://github.com/tym32167/arma3beclient/blob/master/src/Arma3BE.Client.Libs/Repositories/PlayerRepository.cs#L23

person tym32167    schedule 27.06.2016