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

 

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WPF(Windows Presentation Foundation)是一种用于创建Windows桌面应用程序的开发框架,而Prism是一个用于帮助开发人员构建可扩展、模块化的WPF应用程序的框架。 在WPF Prism中,模块是应用程序的组成部分,每个模块都是相对独立、可重用且可扩展的。模块可以使用Prism框架提供的功能进行加载和管理。 模块加载的过程包括以下步骤: 1. 定义模块:首先,需要在应用程序中定义模块。模块通常包括一个模块类,该类实现了IModule接口,并在其中进行模块的初始化工作。 2. 配置模块目录:为了加载模块,需要指定模块所在的目录。可以在应用程序的配置文件中设置模块目录的路径。 3. 模块发现:Prism框架将会在指定的模块目录中查找模块,并获取模块的配置信息。 4. 模块加载:根据模块的配置信息,Prism框架将逐个加载模块。加载过程会创建模块的实例,并在应用程序中进行初始化。 5. 模块初始化:一旦模块被加载,Prism框架将调用模块的初始化方法,用于注册模块的服务、视图等。 通过这种方式,应用程序可以使用Prism框架来实现模块化的架构。模块可以根据需求进行动态加载和卸载,以实现更好的应用程序可扩展性和维护性。 总结起来,WPF Prism模块加载的过程涉及定义模块、配置模块目录、模块发现、模块加载和模块初始化等步骤。通过这些步骤,开发人员可以构建出可扩展、模块化的WPF应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值