在WPF应用程序中,与new相比,使用数据库上下文的构造函数注入真正的好处是什么:在例如使用块中安装一个新实例?
请参阅下面的两个例子。它们都是按预期工作的,但哪一个更好--为什么?
示例1: AppDbContext的新实例
MainWindow
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
using (AppDbContext context = new AppDbContext())
{
var people = context.People.ToList();
// Do stuff with people
}
}
}
AppDbContext
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
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
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);
}
}
发布于 2022-11-16 17:36:20
在这种情况下,接收AppDbContext
实例的要点是您的MainWindow
不需要知道需要传递的选项。
如您所见,当向依赖项注入容器注册AppDbContext
时,它将实例配置为使用某些选项调用,例如要与SqlServer提供程序一起使用的连接字符串。
如果要使用new
直接在MainWindow
中生成实例,则必须知道如何传递这些选项,这不应该是该类所关心的问题。
最好能够在您的App
类(这是您的组合根)中配置它,这样您就不需要在所有需要AppDbContext
实例的类中重复这些知识,这肯定会成为跟踪的维护噩梦。
此外,我想提到,在构造函数中执行数据库操作不是一个好主意。构造函数用于连接服务或初始化业务对象,但是处理异常或从构造函数执行异步操作要困难得多。
最后,如果您想确保在您的窗口没有执行任何操作时没有保持活动上下文,那么最好不要注入上下文本身,而应该是一个工厂,它允许您在需要时实例化上下文。设置起来有点复杂,但它超出了本主题的范围。
https://stackoverflow.com/questions/74464775
复制相似问题