首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >棱镜视图注入Presenter和垃圾回收

棱镜视图注入Presenter和垃圾回收
EN

Stack Overflow用户
提问于 2010-12-10 04:50:06
回答 1查看 885关注 0票数 0

在微软的视图注入示例/文章中,他们有如下代码:

代码语言:javascript
复制
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的弱引用,因此这也不会起到作用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-12-13 23:22:12

这是一个关于生命周期的复杂问题。在此示例中,在Prism文档中,实现了EmployeesPresenter hooks up to an event on the EmployeesListPresenter

代码语言:javascript
复制
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的生命周期捆绑在一起。它在容器中注册,如下所示:

代码语言:javascript
复制
this.container.RegisterType<IEmployeesListPresenter, EmployeesListPresenter>();

也不是staticly或ContainerControlledLifetime。现在我们来看一下EmployeesListPresenter的实现。下面是它的构造函数:

代码语言:javascript
复制
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。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4402972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档