gpt4 book ai didi

c# - 如何将 .net 核心 EF 注入(inject) WPF 应用程序

转载 作者:太空宇宙 更新时间:2023-11-03 20:52:55 25 4
gpt4 key购买 nike

我想注入(inject)我的 .NET Core EntityFramework DbContext (位于 .net 标准库中)到我的 WPF 应用程序中。

我试过了 this Unity approach :

启动时

var container = new UnityContainer();
container.RegisterType<ApplicationDbContext>();
var mainWindow = container.Resolve<MainWindow>();

base.OnStartup(e);

主窗口

private ApplicationDbContext _db;
[Dependency]
public ApplicationDbContext Db
{
get
{
return _db;
}
set
{
_db = value;
}
}

public MainWindow()
{
//StandardDatabase.Commands.Test();

InitializeComponent();
DataContext = this;
FrameContent.Navigate(new PageConsignments());
}

但我在 container.Resolve<MainWindow>() 收到此错误:

The current type, System.Collections.Generic.IReadOnlyDictionary`2[System.Type,Microsoft.EntityFrameworkCore.Infrastructure.IDbContextOptionsExtension], is an interface and cannot be constructed. Are you missing a type mapping?

有人知道我做错了什么吗?欢迎就更好的方法提出任何建议

ApplicationDbContext

public ApplicationDbContext() : base() { }

public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{ }

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder
.UseLazyLoadingProxies()
.UseSqlServer("Server=L-TO-THE-APTOP\\SQLEXPRESS;Database=Maloli;Trusted_Connection=True;MultipleActiveResultSets=true");

optionsBuilder.ConfigureWarnings(x => x.Ignore(CoreEventId.LazyLoadOnDisposedContextWarning));
}

根据 Nkosi 的建议,我删除了 ApplicationDbContext(options) ctor 从上下文中,并摆脱了错误。但是我现在正在检查 Db 的值在这里 MainWindow :

private ICommand goPack;
public ICommand GoPack
{
get
{
return goPack
?? (goPack = new ActionCommand(() =>
{
var c = _db.Parts;
FrameContent.Navigate(new PageConsignments());
}));
}
}

但它返回 null

最佳答案

最初的错误是因为容器正在选择预期 DbContextOptionsBuilder 的构造函数,conateinr 不知道如何正确解析。

由于上下文是在 OnConfiguring 重写中配置的,因此不需要

public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{ }

删除该构造函数,以便容器无错误地解析上下文。

根据依赖初始化和访问的流程,上下文应该显式地注入(inject)到 View 模型中,而不是直接注入(inject)到 View 中。

遵循 MVVM,在 View 模型中拥有所有必要的依赖项和可绑定(bind)属性

public class MainWindowViewModel : BaseViewModel {
private readonly ApplicationDbContext db;

public MainWindowViewModel(ApplicationDbContext db) {
this.db = db;
}

private ICommand goPack;
public ICommand GoPack {
get {
return goPack
?? (goPack = new ActionCommand(() =>
{
var c = db.Parts;
FrameContent.Navigate(new PageConsignments());
}));
}
}
}

更新 View 以依赖于 View 模型

public class MainWindow : Window {
[Dependency]
public MainWindowViewModel ViewModel {
set { DataContext = value; }
}

public MainWindow() {
InitializeComponent();
Loaded += OnLoaded;
}

void OnLoaded(object sender, EventArgs args) {
FrameContent.Navigate(new PageConsignments());
}
}

现在剩下的就是确保所有依赖项都已注册到容器

public class App : Application {
protected override void OnStartup(StartupEventArgs e) {
IUnityContainer container = new UnityContainer();
container.RegisterType<ApplicationDbContext>();
container.RegisterType<MainWindowViewModel>();
container.RegisterType<MainWindow>();

MainWindow mainWindow = container.Resolve<MainWindow>();
mainWindow.Show();
}
}

只要有可能,The Explicit Dependencies Principle通过构造函数注入(inject)应该优先于属性注入(inject)。

但是由于大多数 View 不适合构造函数注入(inject),因此通常应用后者。通过在将 View 模型注入(inject) View 之前确保 View 模型具有所有必要的依赖项,您可以确保所有必需的值在需要时可用。

关于c# - 如何将 .net 核心 EF 注入(inject) WPF 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53459473/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com