Prism之Bootstrapper

Prism之Bootstrapper在程序中使用框架必然要有一个切入点,框架会在这里进行初始化,处理相关配置信息等。在Prism中扮演这一角色的就是Bootstrapper。Prism提供了一个抽象基类Bootstrapper,这个类里面包含了包含了许多空的虚方法,可以重写它们添加自己的逻辑。这个基类与任何容器无关,所以可以通过继承它来实现基于特定容器的Bootstrapper,不过通常我们大…

大家好,又见面了,我是你们的朋友全栈君。

      在程序中使用框架必然要有一个切入点,框架会在这里进行初始化,处理相关配置信息等。在Prism中扮演这一角色的就是Bootstrapper。

      Prism提供了一个抽象基类Bootstrapper,这个类里面包含了包含了许多空的虚方法,可以重写它们添加自己的逻辑。这个基类与任何容器无关,所以可以通过继承它来实现基于特定容器的Bootstrapper,不过通常我们大可不必这样做,因为Prism默认提供了两个基于特定容器的Bootstrapper——UnityBootstrapper和MefBootstrapper,分别使用Unity和Mef来实现依赖注入。而我们需要做的工作就是在这两个类之间选择一个适合自己的,稍微配置一下就可以了。当然如果你不喜欢这两个容器或者已有的程序使用了其它容器(如Spring.Net, Castle等),也可以通过继承Boostrapper抽象基类来实现自己的SpringBootstrapper和CastleBootstrapper。虽然UnityBootstrapper的代码看起来挺简单的,但是如果仿照这个来实现CastleBootstrapper却并不是那么容易的一件事(不信你可以试试),所以更好的办法是用现成的。

      那么Bootstrapper都做了些什么呢?

      1. 创建Logger:

      执行CreateLogger方法,默认创建一个EmptyLogger,不会在任何地方输出log。当然是可以扩展的,比如你可以使用Clog来做一个适配器。

      2. 创建并配置ModuleCatalog

      执行CreateModuleCatalog方法,默认创建一个空的ModuleCatalog。然后执行ConfigureModuleCatalog方法,默认情况下这个方法是空的。可以重写这两个方法,加入自定义的获取ModuleCatalog的逻辑,比如在CreateModuleCatalog中可以从一个xaml文件中读取Module信息。

protected override IModuleCatalog CreateModuleCatalog()
{    
    return ModuleCatalog.CreateFromXaml(new Uri("/AssemblyName;component/ModulesCatalog.xaml",  UriKind.Relative));
}

      3. 创建并配置依赖注入容器

      Prism中使用依赖注入来管理各个组件,你可以使用任何你熟悉的容器,比如Castle, Unity等。Prism中内置了对Unity以及Mef的支持,所以有两种预定义好的Bootstrapper: UnityBootstrapper和MefBootstrapper,其中分别采用UnityContainer和CompositionContainer作为依赖注入容器。以UnityBootstrapper为例,在这一步中会先调用CreateContainer方法,返回一个UnityContainer;然后调用ConfigureContainer方法,在这个方法中主要是将一些常用的类注册到容器中。

      4. 配置默认的Region适配器映射

      为了使xaml中的UI控件可以使用Region,需要先注册一下。Prism默认支持Region的控件类型有:TabControl, Selector, ItemsControl, ContentControl。当然你也可以通过实现IRegionAdapter接口或者直接继承RegionAdapterBase<T>来使其它控件也支持Region。

      5. 配置默认的Region 行为(Behavior)

      为RegionBehaviorFactory添加一些默认的行为。这样可以扩展Region的行为。可以通过实现IRegionBehavior接口或继承RegionBehavior来自定义Region的行为,并重写ConfigureDefaultRegionBehaviors方法添加到Region。

      6. 注册框架异常类型

      Prism提供了ExceptionExtensions类来帮助开发人员定位异常发生的根异常。在这一步通过调用RegisterFrameworkExceptionTypes方法向ExceptionExtensions中添加新的Root Exception。

      7. 创建并初始化Shell

      首先调用CreateShell方法来创建一个Shell,这是一个抽象方法,通常这个方法中就是返回作为整个网站容器的页面。之后会将RegionManager attach到Shell上,然后更新定义的Regions,最后调用InitializeShell方法来初始化Shell。默认情况下这是个空方法,可以通过重写这个方法加入自定义的逻辑,可以在这个方法中将Shell作为Silverlight程序的根容器页面显示出来。

protected override void InitializeShell()
{
    Application.Current.RootVisual = Shell;
}

      8. 初始化Modules

      调用InitializeModules方法,实际上就是调用ModuleManager.Run方法,会调用ModuleCatalog中的所有InitializationMode为WhenAvailable的Module的Initialize方法。

      至此,整个容器的初始化过程就完毕了。

      值得一提的还有CommonServiceLocator,这同样是Patterns & Practices小组的产品。它的作用很简单,就是统一依赖注入容器的接口,使程序不必依赖于特定的容器,只需要使用ServiceLocator,然后去间接地使用其它各种各样的容器。在Prism的内部就是使用ServiceLocator来进行管理的。所以不管使用什么样的容器,都需要提供一个实现了IServiceLocator接口的适配器,如使用Unity要提供UnityServiceLocatorAdapter,使用Mef要提供MefServiceLocatorAdapter。这样不管外部使用什么容器,内部都不需要改变。所以如果要使用Prism重头开始构架一个程序,那么在整个程序中不依赖于特定的依赖注入容器接口,而是使用ServiceLocator是一个不错的选择,这样可以在需要的情况下很容易地更换容器,只需要重写一个Bootstrapper和一个ServiceLocatorAdapter就可以了。

转载于:https://www.cnblogs.com/li-xiao/archive/2011/01/18/1935713.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/162168.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • springboot源码调试

    springboot源码调试学习springboot,第一步官网下载源码然后编译地址:https://github.com/spring-projects/spring-boot/1.选择tag2.进入后选择的版本是2.2.2的版本3.下载完成后解压到相应的文件夹下,进行编译,运行:mvncleaninstall-DskipTests-Pfast4.上述命令大概执行40分钟左右,下面给出已经编译好的链接地址:链接:https://pan.baidu.com/s/1YxZeD…

    2022年5月2日
    82
  • 人工智能技术应用的领域主要有哪些?

    人工智能技术应用的领域主要有哪些?随着智能家电、穿戴设备、智能机器人等产物的出现和普及,人工智能技术已经进入到生活的各个领域,引发越来越多的关注。那么,人工智能目前都应用在哪些领域,运用了怎样的技术原理呢?  什么是人工智能?  人工智能是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学,是认知、决策、反馈的过程。    曾经有很多人戏称,人工智能就像一列火车,你苦苦期盼,它终于来了,

    2022年5月4日
    123
  • 如何在Chrome下使用Postman进行rest请求测试

    如何在Chrome下使用Postman进行rest请求测试

    2021年10月12日
    37
  • mybatis底层通过什么实现_priorityqueue java

    mybatis底层通过什么实现_priorityqueue java一、概述最近接触了一些项目,发现很多项目最开始的时候Service接口和实现类一个方法都没有,通过继承通用底层能够使用基本的增删改查操作了。这种骚操作以前听过但是着实没有亲手实现过,今天参考着自己实

    2022年8月16日
    8
  • 网线RJ45接口针脚[通俗易懂]

    网线接头分两类:DTE:连接到网络中的终端设备,如连PC机网卡的网线DCE:网络设备间连接。如路由器接交换机,或交换机接交换机RJ45接头(水晶头)的接口定义有8个镀金接片的面向上,最左边是第1脚,最右边是第8脚:RJ45网线插头线序接网线有两种线序:T568A和T568B。交叉网线和直连网线直连网线的两端均按T568B连接,用于连接主机和设备,即DTE与DCE,如:电脑←—→ADSL猫、电脑←—→ADSL路由器的LAN口、电脑←—→集线器或交换机等。交叉网线的一端按T568B接,

    2022年4月15日
    51
  • Idea快捷键大全_零之轨迹超详细攻略

    Idea快捷键大全_零之轨迹超详细攻略4.1、字体设置file–>settings–>输入font–>设置字体样式以及字号大小。4.2、快速生成main方法psvm、main4.3、快速生成System.out.println()sout4.4、注意:IDEA是自动保存,不需要ctrl+s4.5、删除一行ctrl+y4.6、怎么运行:代码上右键–>run或者点击左侧的绿色箭头。ctrl+shift+F104.7、左侧窗口中的列表怎么展开?怎么关闭?左箭头关闭。

    2022年9月28日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号