【问题标题】:Why is my app error in design time, but not run time?为什么我的应用程序在设计时出错,但在运行时却没有?
【发布时间】:2013-06-27 02:29:00
【问题描述】:

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

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

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

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

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

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

编辑

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

【问题讨论】:

    标签: wpf xaml mvvm ninject


    【解决方案1】:

    可能 IoC 的绑定在设计时未初始化,IoC.Get(Of IUserRepository)() 正在抛出 NinjectActivationException,因此设计者无法创建视图模型。

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

    // 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 的依赖被优雅地隐藏在一个地方 - 组合根。

    【讨论】:

    • 太棒了,伙计。我回家后会测试一下。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2016-10-17
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2018-12-07
    • 1970-01-01
    相关资源
    最近更新 更多