首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >新的DbContext与DbContext在WPF应用中的构造器注入

新的DbContext与DbContext在WPF应用中的构造器注入
EN

Stack Overflow用户
提问于 2022-11-16 17:29:24
回答 1查看 44关注 0票数 0

在WPF应用程序中,与new相比,使用数据库上下文的构造函数注入真正的好处是什么:在例如使用块中安装一个新实例?

请参阅下面的两个例子。它们都是按预期工作的,但哪一个更好--为什么?

示例1: AppDbContext的新实例

MainWindow

代码语言:javascript
运行
复制
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        using (AppDbContext context = new AppDbContext())
        {
            var people = context.People.ToList();
            // Do stuff with people
        }
    }
}

AppDbContext

代码语言:javascript
运行
复制
public class AppDbContext : DbContext
{
    public DbSet<Person> People { get; set; }

    public AppDbContext()
    {

    }

    public AppDbContext(DbContextOptions options) : base(options)
    {

    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer({DB_CONNECTION_STRING});

        base.OnConfiguring(optionsBuilder);
    }
}

示例2:使用AppDbContext的构造函数注入

MainWindow

代码语言:javascript
运行
复制
public partial class MainWindow : Window
{
    private readonly AppDbContext context;

    public MainWindow(AppDbContext context)
    {
        InitializeComponent();
        this.context = context;

        var people = context.People.ToList();
        // Do stuff with people
   }
}

App.xaml.cs

代码语言:javascript
运行
复制
public partial class App : Application
{
    public static IHost? AppHost { get; private set; }

    public App()
    {
        var builder = Host.CreateDefaultBuilder();

        AppHost = builder.ConfigureServices((hostContext, services) =>
        {
            services.AddSingleton<MainWindow>();
            services.AddDbContext<AppDbContext>(options => 
                options.UseSqlServer({DB_CONNECTION_STRING}));
        }).Build();
    }

    protected override async void OnStartup(StartupEventArgs e)
    {
        await AppHost!.StartAsync();

        AppHost.Services.GetRequiredService<MainWindow>().Show();

        base.OnStartup(e);
    }

    protected override async void OnExit(ExitEventArgs e)
    {
        await AppHost!.StopAsync();

        base.OnExit(e);
    }
}
EN

回答 1

Stack Overflow用户

发布于 2022-11-16 17:36:20

在这种情况下,接收AppDbContext实例的要点是您的MainWindow不需要知道需要传递的选项。

如您所见,当向依赖项注入容器注册AppDbContext时,它将实例配置为使用某些选项调用,例如要与SqlServer提供程序一起使用的连接字符串。

如果要使用new直接在MainWindow中生成实例,则必须知道如何传递这些选项,这不应该是该类所关心的问题。

最好能够在您的App类(这是您的组合根)中配置它,这样您就不需要在所有需要AppDbContext实例的类中重复这些知识,这肯定会成为跟踪的维护噩梦。

此外,我想提到,在构造函数中执行数据库操作不是一个好主意。构造函数用于连接服务或初始化业务对象,但是处理异常或从构造函数执行异步操作要困难得多。

最后,如果您想确保在您的窗口没有执行任何操作时没有保持活动上下文,那么最好不要注入上下文本身,而应该是一个工厂,它允许您在需要时实例化上下文。设置起来有点复杂,但它超出了本主题的范围。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74464775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档