prism模块化问题总结(2)
来源:互联网 发布:kettle 实时数据同步 编辑:程序博客网 时间:2024/05/16 05:59
继续讨论出现的问题
1.重新加载时,不要将view临时保存起来
理由:这样将导致重新加载时,view的容器还存在,view无法加入。还会导致内存的问题.删除时也应该将其删除.
如
private List<object> viewList = new List<object>();private void AddRegionMenu(string region, string header,Func<object> view){ MenuItem regionItem = new MenuItem() { Header = header }; regionItem.Items.Add(CreateMenuItem("加载模块", new Action(() => { var currentView = view(); viewList.Add(currentView); _regionManager.Regions[region].Add(currentView,"",true); }))); }
2.注册一个模块的时候最好重新注册一个新的UnityContainer容器
理由:很有可能在卸载这个模块的时候,需要释放资源,即调用UnityContainer的dispose方法.若调用顶级容器方法的话,那么默认容器注册的prism服务将无法使用了.
private readonly IUnityContainer _container; public Module(IUnityContainer container){ this._container = container.CreateChildContainer();}
3.当模块UnityContainer容器新注册时,不要用ServiceLocator全局调用子容器注册的服务
理由:ServiceLocator只能调用等级容器的服务,无法调用子容器的服务
this._container = container.CreateChildContainer();_container.RegisterType<IEmployeeService, EmployeeService>(new ContainerControlledLifetimeManager());ServiceLocator.Current.GetInstance<IEmployeeService>();//wrong
重新在该模块注册一个单例的实例来调用,或者将子容器命名存到父容器中
this._container = container.CreateChildContainer();container.RegisterInstance("test",_container);_container.RegisterType<IEmployeeService, EmployeeService>(new ContainerControlledLifetimeManager());ServiceLocator.Current.GetInstance<IUnityContainer>("test").Resolve<IEmployeeService>();
一般情况下
4.在模块化控件中以ServiceLocator调用Service
理由:以Region的方式添加View一定程度上肯定不如直接拉控件到界面上方便.
某些控件是可以这么做的.因为其功能是固定的.这个功能与asp.net的控件做法很相似.将控件与逻辑的数据封装在一起,使得一个控件就是一个小功能.
<local:CheckBoxSkillList />
上面的xaml很容易让人接受,即一个skill的checkbox列表.但这个控件需要service来获取数据.
否则我们则要这样做:
var view= new CheckBoxSkillList();_regionManager.Regions[region].Add(view);
一个小的ui控件并不适合这么做,这里可能会有争议.这感觉上破坏了mvc.ui与数据牵涉了关系.
5.释放资源与重新注册服务
理由:尽可能回收内存.
在Region中移除View时,最好先调用UnityContainer容器的dispose方法.只要在该容器中的服务,实现了IDisposable接口的对象都会调用到,然后重新创建容器,并重新注册服务.
这在一定程度上加快了垃圾回收,虽然无法完全回收.
_container.Dispose();_container = _container.Parent.CreateChildContainer();
RegisterViewAndService();
6.关联模块加载的区域和控件
理由:当使用某控件加载模块后,为防止重复记载此模块出现错误,在加载模块后要禁止该控件重复加载.在该模块卸载后又可以重新加载.
这个要看具体情况来设计,这是一个需要注意的点.
- prism模块化问题总结(2)
- prism模块化问题总结(1)
- Prism框架应用程序界面布局:模块化
- Prism
- prism
- 建立maven模块化项目遇到的问题总结
- Prism V2之旅(2)
- Prism V2之旅(2)
- Prism V2之旅(2)
- 【JavaScript】模块化写法总结
- JS模块化编程总结
- js模块化编程总结
- C模块化编程总结
- Flex模块化(module)学习总结
- Keil 模块化程序设计(总结)
- keil C模块化编程总结
- 程序模块化的阶段性总结
- STC单片机单片机模块化总结
- com学习笔记(2)基本的com接口-QueryInterface的实现
- com学习笔记(1)基础接口的定义
- show部分书...
- wpf && silverlight开发框架(prism)系列教程
- prism behavior图示
- prism模块化问题总结(2)
- wpf&& silverlight的Behavior
- Oracle 10g Enhancements to Analytical Functions -- Using Partitioned Outer Joins To "Densify" Data
- c++ primer学习笔记(4)-运算符
- c++ primer学习笔记(3)-字符串操作
- c++ primer学习笔记(1)
- c++ primer学习笔记(2)-c++基本数据类型
- prism模块化问题总结(1)
- 记上海俱乐部活动