c# – 如何管理MVVM中的对象生存期?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 如何管理MVVM中的对象生存期?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1528字,纯文字阅读大概需要3分钟。
内容图文
![c# – 如何管理MVVM中的对象生存期?](/upload/InfoBanner/zyjiaocheng/778/ff536f1b8dce44f8b5af7aaa2ff3cf4a.jpg)
我正在研究使用C#和WPF构建的应用程序,它(很糟糕地)实现了MVVM.工作分解如下:
>查看
>演示文稿,位图,颜色等
>动画(如果使用)
>通过绑定数据与ViewModel进行通信
>通过在ViewModel上添加命令来与ViewModel进行通信
> ViewModel
>公开由视图调用的命令
>将数据处理功能委托给模型
>定义UI行为
>视图没有直接(命名)依赖
>通过调用模型中的方法与模型进行通信
>可以通过订阅模型公开的事件来通知模型中的更改
>模型
>磁盘持久性,数据分析等
>其他一切
>不依赖于ViewModel
不幸的是,这导致循环引用,因为视图需要引用视图模型来引发事件和激活命令,视图模型需要引用视图才能更新视图状态(通常此引用是由视图模型作为WPF的DataContext),视图模型需要引用模型来委派工作,而模型通常需要通知视图模型一些外部状态的变化.
所以我们有两个循环引用问题,viewmodel位于中间.因此,此应用程序遇到内存消耗问题,因为WPF实体正在创建并与模型中的某些数据相关联,并且这些实体永远不会被清除(直到程序终止).
这怎么应该处理?
似乎需要定义所有权图,这样一个或多个这些组件负责在事件处理程序不再相关时断开事件处理程序,以便事物可以进行GC.
解决方法:
您的问题没有提供有关实例化内容的足够信息,我怀疑如果不挖掘所有代码就可以解决这个问题.
第一:这是一个非常糟糕的MVVM,因为这里违反了层和关注点的分离.
我建议先解决这个问题.
你的问题可能是对XAML和实例化的理解很差(没有冒犯)
在不触及架构的情况下,您需要对应用程序进行概要分析,以查看哪些对象被实例化了多少次(内存热点).看看哪些GC生成这些对象可能也很有趣,因为这可能表明存在严重(手动)内存管理问题.
事件处理程序往往会造成泄漏.因此可以应用弱参考模式:http://msdn.microsoft.com/en-us/library/aa970850.aspx
一个好的MVVM有一些生命周期管理,也可以作为DI和IoC容器服务器,通过它来处理复杂的生命周期场景
内容总结
以上是互联网集市为您收集整理的c# – 如何管理MVVM中的对象生存期?全部内容,希望文章能够帮你解决c# – 如何管理MVVM中的对象生存期?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。