Prism教程二: Bootstrapper

Prism教程二: Bootstrapper在程序中使用框架必然要有一个切入点,框架会在这里进行初始化,处理相关配置等。在Prism中扮演这一角色的就是Bootstrapper。Prism提供了一个抽象基类Bootstrapper,这个类里面包含了许多空的虚方法,可以重写他们添加自己的逻辑。这个

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

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

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

#region Assembly Microsoft.Practices.Prism.dll, v2.0.50727
// C:\Program Files (x86)\Prism4.0\Bin\Silverlight\Microsoft.Practices.Prism.dll
#endregion

using Microsoft.Practices.Prism.Logging;
using Microsoft.Practices.Prism.Modularity;
using Microsoft.Practices.Prism.Regions;
using System;
using System.Windows;

namespace Microsoft.Practices.Prism
{
    public abstract class Bootstrapper
    {
        protected Bootstrapper();

        protected ILoggerFacade Logger { get; set; }
        protected IModuleCatalog ModuleCatalog { get; set; }
        protected DependencyObject Shell { get; set; }

        protected virtual IRegionBehaviorFactory ConfigureDefaultRegionBehaviors();
        protected virtual void ConfigureModuleCatalog();
        protected virtual RegionAdapterMappings ConfigureRegionAdapterMappings();
        protected abstract void ConfigureServiceLocator();
        protected virtual ILoggerFacade CreateLogger();
        protected virtual IModuleCatalog CreateModuleCatalog();
        protected abstract DependencyObject CreateShell();
        protected virtual void InitializeModules();
        protected virtual void InitializeShell();
        protected virtual void RegisterFrameworkExceptionTypes();
        public void Run();
        public abstract void Run(bool runWithDefaultConfiguration);
    }
}

那么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的行为,并重写ConfigureDefaultBehavior放啊添加到Region。

6. 注册框架异常类型

Pism提供了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. 初始化Module

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

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

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

 

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

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

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


相关推荐

  • Linux下载安装mysql及配置环境变量

    Linux下载安装mysql及配置环境变量一、下载(原文链接:http://www.studyshare.cn/blog-front//software/details/1144官网下载:https://dev.mysql.com/get/Downloads/网盘下载(5.7版本):https://pan.baidu.com/s/1VMQw1mcERMdlsJrINzNawA提取码:4c9i直接使用linux命令下载到linxu…

    2022年6月22日
    39
  • 用python画一个爱心_python 画一个点

    用python画一个爱心_python 画一个点fromturtleimport*pensize(1)pencolor(‘red’)fillcolor(‘pink’)speed(5)up()goto(-30,100)down()begin_fill()left(90)circle(120,180)circle(360,70)left(38)circle(360,70)circle(120,180)end_fill()up()goto(-100,-100)down()

    2025年9月23日
    5
  • vim命令复制粘贴命令_linux编辑文件命令vim

    vim命令复制粘贴命令_linux编辑文件命令vim今天被vim的复制粘贴弄得很烦,它不像windows那样,每次复制会把以前的内容覆盖。所以有时粘贴出来的东西并不是你想要的。在不同终端中,用vim打开的两个文件之间的复制粘贴1.用同一个终端,直接使用这个命令:vimfile1file2这样就可以直接用y和p复制粘贴了。但是这样比较麻烦,需要在两个文件之间切换。2.之所以不能直接用y和p复制粘贴。是因为每个终端中的vim复制的内容存储在不同…

    2022年9月22日
    2
  • 3 InetAddress

    3 InetAddressInetAddress的使用

    2022年6月23日
    21
  • 【Ruby】【改gem源镜像】【Win10 + Jruby-9.1.2.0 + Rails 5.1.3 + gem 2.6.4 】

    【Ruby】【改gem源镜像】【Win10 + Jruby-9.1.2.0 + Rails 5.1.3 + gem 2.6.4 】参考地址:https://ruby-china.org/topics/33843(1)>gemsources–addhttp://gems.ruby-china.org遇到问题:Errorfetchinghttps://gems.ruby-china.org/:certificateverifyfailed(https://gems.ruby-china.org/…

    2022年6月6日
    28
  • django笔记_django 异步

    django笔记_django 异步前言Django是一个开放源代码的Web应用框架,由Python写成,最初用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站,即CMS(内容管理系统)软件,于2005年7月在BSD许可证下发布,这

    2022年8月7日
    4

发表回复

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

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