使用 IOC 子容器时如何实现 ViewModelLocator 模式?典型的定位器实现类似于:
public IViewModel ViewModel
{
get { return Services.ServiceLocator.GetInstance<IViewModel>(); }
}
其中 Services.ServiceLocator 是只读静态属性。但是,如果您使用子容器,这将失效。这是我使用子容器对 Services.ServiceLocator 的定义:
public static IServiceLocator ServiceLocator
{
get { return RootContext.ServiceLocator; }
}
显然这是不正确的:我注入的依赖项将来自根容器而不是子容器。(子容器是由我当前视图以外的东西创建和引导的。因此我当前的视图可以自动从子容器连接。)
那么如何在多容器场景中获得正确的容器呢?标准答案是构造函数注入它,但 ViewModelLocator 似乎不可能:它需要一个默认构造函数,因此可以从 XAML 构造它。
由于我正在研究 PRISM 复合应用程序(因此没有标记扩展),因此我也在寻求一种适用于 Silverlight 4 和 WPF 4.0 的解决方案。我碰巧使用 Unity 作为 IOC 容器。哦,该解决方案应该在 Blend 中工作(也就是说,它不应该阻止创建绕过 IoC 容器的新设计时视图模型)。