【问题标题】:Mvvm Light and Entity Framework Core best practicesMvvm Light 和 Entity Framework Core 最佳实践
【发布时间】:2016-06-27 10:01:03
【问题描述】:

我正在使用 Mvvm Light 和 Entity Framework Core 创建一个新的 UWP 应用程序。我是这两种技术的新手。

我创建了我的模型:Article 类是一个简单的 ObservableObject,具有 3 个属性:IdRéférenceDésignation em>。

我的 DbContext 如下:

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

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

}

我正在寻找管理 DbContext 和我的不同视图的最佳方式。

为整个应用程序创建一个 DbContext 更好吗? 我不太喜欢这个主意

我必须在每个 ViewModel 中创建一个 DbContext 吗? 我更喜欢这个
当用户在文章列表视图中双击一个项目时,我导航到文章详细视图并将文章传递给与文章详细视图关联的视图模型。但是这篇已经存在的文章与文章详细视图模型的 DbContext 无关。

是否可以仅在需要时实例化 DbContext ? 我的首选
为此,我将文章从列表视图模型传递到详细视图模型。然后,当用户单击保存时,我执行如下操作:

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

当然,这适用于新文章(插入),但不适用于现有文章(更新)。

我在这里很难下定决心。

提前非常感谢, 朱利安

【问题讨论】:

  • 我会查找 CQRS 和 Mediatr。每次使用时都应该创建一个实例,因为每个实例都是一个工作单元。
  • Callum,在这种情况下,如何将我视图中编辑的文章传递给新的 DbContext 以便将其保存到数据库中?
  • 如果您阅读 MediatR,您将创建所谓的 class SaveArticleRequest : IRequest&lt;Article&gt; 然后使用 mediator.SendAsync(new SaveArticleRequest(article)); 在 MediatR 中发送此内容,这样您只创建非常利基(SRP)的类来处理一件事情。这意味着您可以非常详细地组成您的系统。恕我直言,这是一个惊人的模式。
  • 在您的问题中发布viewModel 代码,我将使用 CQRS 为您创建答案。
  • @JulienFerraro,如果你想创建大型复杂的应用程序,我建议你使用 PRISM。如果你创建的东西非常小,那么你可以使用任何你想要的东西。

标签: c# entity-framework uwp mvvm-light


【解决方案1】:

在我看来,你应该通过接口隐藏所有存储操作(比如 IArticleRepo 或类似的东西),你应该使用 IoC 来访问它(如果某些类想要使用 Store,它必须在 ctor 参数中声明 IArticleRepo) .此外,在此接口 IArticleRepo 中,您可以对 Articles 进行必要的操作,例如 IArticleRepo.AddArticle(Article a)。如果您这样做,您可以稍后选择是否要为每个操作创建 dbcontext,或者您可能希望使用 IoC 容器将 IArticleRepo 实现作为单调。但是这样的决定不应该影响其他代码。 作为我的代码中非常简单的示例(我只显示了这个文件,整个项目很丑,我会改变它)https://github.com/tym32167/arma3beclient/blob/master/src/Arma3BE.Client.Libs/Repositories/PlayerRepository.cs#L23

【讨论】:

    猜你喜欢
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-01
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多