zoukankan      html  css  js  c++  java
  • prism模块化问题总结(2)

    继续讨论出现的问题

    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.关联模块加载的区域和控件

    理由:当使用某控件加载模块后,为防止重复记载此模块出现错误,在加载模块后要禁止该控件重复加载.在该模块卸载后又可以重新加载.

    image

    这个要看具体情况来设计,这是一个需要注意的点.

  • 相关阅读:
    最全前端面试题
    经常犯的思维误区
    鸿蒙系统发布会
    前端面试题
    怎么做一个竖排文字?
    canvas-台球玩法
    canvas-自由落体球
    canvas-画一颗心
    canvas-学写字
    常用的65条正则表达式
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/1432242.html
Copyright © 2011-2022 走看看