1

我正在使用 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 永远不会被初始化?

4

1 回答 1

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 容器的硬编码依赖关系连接起来并不是一个好主意——它通常被称为“服务定位器反模式”。尝试在此链接中进行处理:WPF 中的 Ninject 构造函数注入=> 还使用了服务定位器,它将负责创建您的 ViewModel,但是对 IoC 的依赖被优雅地隐藏在一个地方 - 组合根。

于 2013-06-27T07:02:53.340 回答