ViewModelLocator与IOC子容器?

时间:2011-04-19 21:02:07

标签: silverlight ioc-container viewmodel mvvm-light viewmodellocator

当您使用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构造。

我也在使用Silverlight 4和WPF 4.0的解决方案,因为我正在使用PRISM复合应用程序(因此没有标记扩展)。我碰巧使用Unity作为IOC容器。哦,解决方案应该在Blend中工作(也就是说,它不应该阻止创建绕过IoC容器的新设计时间视图模型)。

1 个答案:

答案 0 :(得分:1)

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

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

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

修改 对于您的特殊情况,this可能会有所帮助。虽然我没有时间观看视频洛朗告诉我他正在展示一种动态加载视图模型的方法。我希望这对你有帮助!