0

使用 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 容器的新设计时视图模型)。

4

1 回答 1

1

通常,子容器定义查找层次结构。但是,您的基础容器必须创建您的子容器- 将自身作为参数传递。

为了访问子容器,您可以拥有一个返回子容器的属性——单例实例或瞬态(即新)实例。但是,如果您想要可混合性,您应该注意,子容器需要在您的资源中才能在设计时绑定到它。

在任何情况下,您都必须确保正确清理 ViewModel 的实例,以免造成内存泄漏。

编辑: 对于您的特殊情况,这可能会有所帮助。尽管我没有时间观看 Laurent 告诉我的视频,他正在演示一种动态加载视图模型的方法。我希望这对你有帮助!

于 2011-06-14T18:34:13.127 回答