在微软的视图注入示例/文章中,他们有如下代码:
public void Initialize()
{
this.RegisterViewsAndServices();
EmployeesPresenter presenter = this.container.Resolve<EmployeesPresenter>();
IRegion mainRegion = this.regionManager.Regions[RegionNames.MainRegion];
mainRegion.Add(presenter.View);
}http://msdn.microsoft.com/en-us/library/dd458920.aspx
这里解析了Presenter,它包含IEmployeesView类型的公共属性,用于将视图注入区域。解析presenter的好处是它自动绑定到视图(通过构造函数获取它(通过unity))。但是,您不认为Presenter容易发生垃圾回收吗?因为在initialize方法的作用域结束后,没有任何内容引用presenter。
除非VM/View有一个由presenter订阅的事件,否则View/ViewModel显然不会引用presenter。我们可能会进入一种不一致的状态,在这种状态下,视图是活动的,但是presenter是垃圾收集的。
为了防止presenter的垃圾回收,我们可能需要在ViewModel中使用一个KeepAlive属性,该属性只包含presenter的引用,以防止其GC,但在我看来,这听起来很麻烦。在这种情况下,你会做什么或会做什么?
请注意,在有多个视图实例的情况下,将演示者注册到ContainerControlledLifetimeManager是不可行的。此外,如果presenter (带有视图)的通信模式是通过命令,并且命令恰好是棱镜的DelegateCommands,那么它们将只保留对presenter的弱引用,因此这也不会起到作用。
发布于 2010-12-13 23:22:12
这是一个关于生命周期的复杂问题。在此示例中,在Prism文档中,实现了EmployeesPresenter hooks up to an event on the EmployeesListPresenter
public EmployeesPresenter(
IEmployeesView view,
IEmployeesListPresenter listPresenter,
IEmployeesController employeeController)
{
this.View = view;
this.listPresenter = listPresenter;
this.listPresenter.EmployeeSelected += new EventHandler<DataEventArgs<BusinessEntities.Employee>>(this.OnEmployeeSelected);
this.employeeController = employeeController;
View.SetHeader(listPresenter.View);
}这将EmployeesPresenter的生命周期与IEmployeesListPresenter的生命周期捆绑在一起。它在容器中注册,如下所示:
this.container.RegisterType<IEmployeesListPresenter, EmployeesListPresenter>();也不是staticly或ContainerControlledLifetime。现在我们来看一下EmployeesListPresenter的实现。下面是它的构造函数:
public EmployeesListPresenter(IEmployeesListView view,
IEmployeeService employeeService)
{
this.View = view;
this.View.EmployeeSelected += delegate(object sender, DataEventArgs<BusinessEntities.Employee> e)
{
EmployeeSelected(sender, e);
};
view.Model = employeeService.RetrieveEmployees();
}现在我们看到EmployeesListPresenter与IEmployeesListView的生命周期捆绑在一起。
因此,EmployeesPresenter的生命周期与EmployeesListView的生命周期相同,基本上与它在控件树中的长度一样长。
这是一个非常令人困惑的样本。你会发现Prism 4的例子要简单得多……我建议你看看它们,如果你有选择的话,可能还会升级到Prism 4。
https://stackoverflow.com/questions/4402972
复制相似问题