gpt4 book ai didi

wpf - 为什么我的应用程序在设计时出错,但在运行时却没有?

转载 作者:行者123 更新时间:2023-12-03 10:38:01 24 4
gpt4 key购买 nike

我正在使用 Ninject 创建一个 WPF 应用程序。我在 Application.xaml.vb 中创建了我的绑定(bind),然后将内核存储在 Application.Current.Properties 中,以便我可以根据需要解析这些绑定(bind)。

我在设计时收到此错误:无法创建“MainUserViewModel”的实例。如果我从 MainUserViewModel 的构造函数中删除代码,我不会收到错误消息。

Public Sub New()
'IoC is the kernel
Dim repository = IoC.Get(Of IUserRepository)()
_users = New ObservableCollection(Of User)(repository.GetAll())
End Sub

但是,当我运行代码时,我的错误消失了,我的 View 从 _users 填充得很好。我认为如果出现错误,代码将无法编译并且(似乎)可以工作。

我已经删除了我的虚拟机的所有其他部分并将它们全部重新添加。错误仅在我使用该行代码时出现。

谁能解释为什么会这样?我检查了存储库,所有预期的数据都在那里。

编辑

由于依赖项未运行而无法解决,因此 XAML 中是否可能发生错误?那么,据它所知,那个 observable 永远不会被初始化?

最佳答案

可能 IoC 的绑定(bind)在设计时未初始化,IoC.Get(Of IUserRepository)()正在 throw NinjectActivationException因此 View 模型不能由设计师创建。

我会从构造函数中移动初始化代码,例如到一些延迟加载的属性。

// sorry for C#
private ObservableCollection<User> _users;
public ObservableCollection<User>
{
get
{
if(_users == null){
repository = IoC.Get<IUserRepository>();
_users = new ObservableCollection<User>(repository.GetAll());
}
return _users;
}
}

但是,将所有代码与对 IOC 容器的硬编码依赖关系连接起来并不是一个好主意——它通常被称为“服务定位器反模式”。尝试在此链接中接近: Ninject constructor injection in WPF => 还使用了服务定位器,它将负责创建您的 ViewModel,但是对 IoC 的依赖被优雅地隐藏在一个地方 - 组合根。

关于wpf - 为什么我的应用程序在设计时出错,但在运行时却没有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17333589/

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