我应该将 dbContext 注入 WPF 吗?

Should I inject dbContext into WPF?

老办法

直到现在我创建了 dbContext 如下,所以 dbContext 是短暂的,它应该是(dbContext 仅在特定操作时有效)。

using (var dbContext = new MainDbContext())
{ ... }

新方式

现在我尝试将 DI 用于 dbContext。目前我不想使用任何 DI 容器只是纯 DI。

public partial class MainWindowViewModel 
{
    IMainDbContext dbContext;

    public MainWindowViewModel(IMainDbContext dbContext)
    {
        this.dbContext = dbContext;
    }    
}

我的作文根在OnStartup

private void OnStartup(object sender, StartupEventArgs e)
    {
        var mainWindowViewModel = new MainWindowViewModel(new MainDbContext());
        ...
    }

我不喜欢这种新方法,因为 dbContext 始终处于活动状态,而不仅仅是针对特定操作。 1. 有替代方案吗?

我有几个 ViewModel。 2. 我应该为所有这些使用相同的 dbContext 实例吗?

新方法总是在合成中创建 MainDbContext,尽管我可能不会在需要 MainDbContext 的 GUI 中按下这样的按钮。 3. 有解决方法吗?

你的问题主要是基于意见的,即没有对错之分。

在 N 层企业应用程序中,EF 上下文应该只存在于服务器端的数据访问层 (DAL) 中。客户端通常通过使用上下文获取数据的服务层使用数据库。

您是否应该对所有视图模型使用相同的上下文取决于您的数据库操作是否跨越多个视图模型。例如,您是否使用一个视图模型修改实体并通过在另一个视图模型中调用 SaveChanges() 来保留更改?那么至少在这两个视图模型之间共享上下文是有意义的。

长寿命和短寿命上下文的情况相同。这取决于您的情况。但是如果你将上下文注入到一些视图模型中,你可能想将它注册为一个单例实例。如果需要,您始终可以在其他视图模型中使用短暂的(非注入的)上下文。