为什么我的应用程序在设计时出错,而不是运行时?

时间:2013-06-27 02:29:00

标签: wpf xaml mvvm ninject

我正在使用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填充得很好。我想如果有错误,代码将无法编译和(似乎)工作。

我删除了我的其他所有VM并将它们全部添加回来。只有在我使用该行代码时才会出现错误。

任何人都可以解释为什么会这样吗?我检查了存储库,所有预期的数据都在那里。

修改

由于依赖关系因为没有运行而无法解决,因此XAML中是否可能发生错误?那么,据他所知,这个可观测量从未被初始化?

1 个答案:

答案 0 :(得分:1)

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

我会从构造函数中移动init代码,例如一些懒惰的财产。

// 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 =&gt;还有一个服务定位器的使用,它将负责创建你的ViewModel,但是对IoC的依赖优雅地隐藏在一个地方 - 组合根。