Prism初研究之Bootstrapper

Prism初研究之BootstrapperPrism初研究之初始化应用Prism初研究之初始化应用BootstrapperDIShell关键抉择核心步骤创建Bootstrapper实现CreateShell方法实现InitializeShell方法创建并配置ModuleCatalog创建并配置Container核心服务(与应用无关)与应用相关的服务(StockTraderRI)在UnityBootstrapper中创建并配置…

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

Prism初研究之初始化应用

Bootstrapper

Bootstrapper类的责任是使用Prism类库初始化应用程序,抽象类Bootstrapper提供的函数大多都是虚方法。
Bootstrapper初始化过程

DI

UnityBootstrapper和MefBootstrapper类实现了大多数必须的功能。

Shell

在Prism应用中,创建Shell或者主窗口的责任是Bootstrapper的。因为Shell依赖的一些服务比如Region Manager需要在Shell显示之前初始化。

关键抉择

  • 是否使用Unity、MEF或者其它的dependency injection container,这决定Bootstrapper类创建;
  • 应用使用那些服务,这些服务需要注册到container中;
  • 决定创建日志服务是否需要,或者是否需要其它日志服务;
  • 决定哪些模块是希望应用发现的,通过显示代码声明、文件夹扫描、配置文件还是XAML方式配置;

核心步骤

创建Bootstrapper

实现CreateShell方法

返回你应用程序Shell类的实例,可以根据需求选择创建Shell对象或者从Container中获取Shell。


  1. protected override DependencyObject CreateShell()
  2. {
  3. return this.Container.Resolve<Shell>();
  4. }

实现InitializeShell方法

创建Shell之后显示之前,需要为应用程序设置主界面。


  1. protected override void InitializeShell()
  2. {
  3. base.InitializeShell();
  4. //基类的InitializeShell()没有做任何事。
  5. App.Current.MainWindow = (Window) this.Shell;
  6. App.Current.MainWindow.Show();
  7. }

创建并配置Module Catalog

抽象类Bootstrapper的CreateModuleCatalog()返回new ModuleCatalog。


  1. protected virtual IModuleCatalog CreateModuleCatalog()
  2. {
  3. return new ModuleCatalog();
  4. }

UnityBootstrapper和MEFBootstrapper类的Run方法都调用CreateModuleCatalog()方法,为ModuleCatalog属性设置返回值。

创建并配置Container

Container在Prism应用中扮演关键角色,Prism类库和应用程序需要Container来提供服务、模块等的依赖关系。在Container的Configuration过程中,需要的核心服务被注册。

核心服务(与应用无关)

服务接口 描述
IModuleManager 检索、初始化应用程序模块的接口
IModuleCatalog 包含模块的元数据;Prism框架提供一些不同的模块分类
IModuleInitializer 初始化模块
IRegionManager 注册、检索Region的接口
IEventAggregator 一组松耦合的事件
ILoggerFacade 框架为日志服务提供了包装机制,日志服务在bootstrapper.Run()方法中注册。使用CreateLogger方法的返回值,所以如果需要定制日志服务,需要覆写CreateLogger()方法
IServiceLocator 允许Prism 类库访问Container。如果需要定制或者扩展类库将会很有用

与应用相关的服务(Stock Trader RI)

Stock Trader RI 中的服务 描述
IMarketFeedService 提供实时的市场数据,PositionSummaryViewModel使用此服务
IMarketHistoryService 提供市场历史数据
IAccountPositionService 提供基金列表
IOrdersService 提交订单服务
INewsFeedService 提供选择基金的新闻
IWatchListService 控制添加新的监控数据到监控列表

在UnityBootstrapper中创建并配置Container

CreateContainer

UnityBootstrapper的CreateContainer方法返回一个UnityContainer的实例,通常这种行为不需要被改变,如果要改变,覆盖这个方法即可。

ConfigureContainer

ConfigureContainer方法注册了一系列Prism核心服务(默认)


  1. // UnityBootstrapper.cs
  2. protected virtual void ConfigureContainer()
  3. {
  4. ...
  5. if (useDefaultConfiguration)
  6. {
  7. RegisterTypeIfMissing(typeof(IServiceLocator), typeof(UnityServiceLocatorAdapter), true);
  8. RegisterTypeIfMissing(typeof(IModuleInitializer), typeof(ModuleInitializer), true);
  9. RegisterTypeIfMissing(typeof(IModuleManager), typeof(ModuleManager), true);
  10. RegisterTypeIfMissing(typeof(RegionAdapterMappings), typeof(RegionAdapterMappings), true);
  11. RegisterTypeIfMissing(typeof(IRegionManager), typeof(RegionManager), true);
  12. RegisterTypeIfMissing(typeof(IEventAggregator), typeof(EventAggregator), true);
  13. RegisterTypeIfMissing(typeof(IRegionViewRegistry), typeof(RegionViewRegistry), true);
  14. RegisterTypeIfMissing(typeof(IRegionBehaviorFactory), typeof(RegionBehaviorFactory), true);
  15. RegisterTypeIfMissing(typeof(IRegionNavigationJournalEntry), typeof(RegionNavigationJournalEntry), false);
  16. RegisterTypeIfMissing(typeof(IRegionNavigationJournal), typeof(RegionNavigationJournal), false);
  17. RegisterTypeIfMissing(typeof(IRegionNavigationService), typeof(RegionNavigationService), false);
  18. RegisterTypeIfMissing(typeof(IRegionNavigationContentLoader), typeof(UnityRegionNavigationContentLoader), true);
  19. }
  20. }

RegisterTypeIfMissing()方法确保服务不会被注册两次。
如果不想默认注册服务,调用Bootstrapper.Run(false),然后手动注册服务。

示例:QuickStartBootstrapper(Modularity QuickStart)

  1. protect override void ConfigureContainer()
  2. {
  3. base.ConfigureContainer();
  4. this.RegisterTypeIfMissing(typeof(IModuleTracker), typeof(ModuleTracker), true);
  5. this.Container.RegisterInstance<CallbackLogger>(this.callbackLogger);//CallbackLogger为单例
  6. }

在MefBootstrapper中创建并配置Container

CreateContainer

在CreateContainer中做了以下几件事:

  1. 创建一个AssemblyCatalog和一个CatalogExportProvider(CompositionContainer构造函数中);
  2. 返回一个CompositionContainer新实例。
ConfigureContainer

这个函数默认注册一组Prism核心服务:


  1. protected virtual void ConfigureContainer()
  2. {
  3. this.RegisterBootstrapperProvidedTypes();
  4. }
  5. protected virtual void RegisterBootstrapperProvidedTypes()
  6. {
  7. this.Container.ComposeExportedValue<ILoggerFacade>(this.Logger);
  8. this.Container.ComposeExportedValue<IModuleCatalog>(this.ModuleCatalog);
  9. this.Container.ComposeExportedValue<IServiceLocator>(new MefServiceLocatorAdapter(this.Container));
  10. this.Container.ComposeExportedValue<AggregateCatalog>(this.AggregateCatalog);
  11. }

注意:在MefBootstrapper中,核心的服务都是单例。

示例:QuickStartBootstrapper()

MefBootstrapper另外两个可以重载的函数来创建和配置AggregateCatalog:

  • CreateAggregateCatalog;
  • ConfigureAggregateCatalog;

  1. protected override void ConfigureAggregateCatalog()
  2. {
  3. base.ConfigureAggregateCatalog();
  4. // Add this assembly to export ModuleTracker
  5. this.AggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(QuickStartBootstrapper).Assembly));
  6. // Module A is referenced in in the project and directly in code.
  7. this.AggregateCatalog.Catalogs.Add(
  8. new AssemblyCatalog(typeof(ModuleA.ModuleA).Assembly));
  9. this.AggregateCatalog.Catalogs.Add(
  10. new AssemblyCatalog(typeof(ModuleC.ModuleC).Assembly));
  11. // Module B and Module D are copied to a directory as part of a post-build step.
  12. // These modules are not referenced in the project and are discovered by
  13. inspecting a directory.
  14. // Both projects have a post-build step to copy themselves into that directory.
  15. DirectoryCatalog catalog = new DirectoryCatalog("DirectoryModules");
  16. this.AggregateCatalog.Catalogs.Add(catalog);
  17. }

转载于:https://www.cnblogs.com/qianzi067/p/5804837.html

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

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

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


相关推荐

  • C#编写单片机上位机软件-串口通讯(BMS汽车动力电池管理系统)

    C#编写单片机上位机软件-串口通讯(BMS汽车动力电池管理系统)上位机软件做了有一段时间,本人呕心沥血的作品。之前用python+pyQT5做,主线程特别特别容易闪退,数据重叠等问题,走了很多弯路;后来用VS的C#做,只能说上手很快,调试效果也不错,而且关键是非常非常简单易读,只希望大家不要像我一样,走这么多弯路–想要源码的小伙伴们,欢迎关注点赞三连+留言邮箱哦~华丽的分割线——————————————————————————————–

    2022年5月31日
    54
  • java队列(Queue)用法总结[通俗易懂]

    java队列(Queue)用法总结[通俗易懂]1.队列的特点队列是一种比较特殊的线性结构。它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中最先插入的元素也将最先被删除,对应的最后插入的元素将最后被删除。因此队列又称为“先进先出”(FIFO—firstinfirstout)的线性表,与栈(FILO-firstinlastout)刚好相反…

    2022年7月14日
    21
  • xpath定位随机元素之starts-with的用法

    xpath定位随机元素之starts-with的用法

    2021年5月24日
    118
  • 使用FastJSON 对Map/JSON/String 进行互转[通俗易懂]

    使用FastJSON 对Map/JSON/String 进行互转[通俗易懂]Fastjson是一个Java语言编写的高性能功能完善的JSON库,由阿里巴巴公司团队开发的主要特性主要体现在以下几个方面:1.高性能fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jackson。并且还超越了google的二进制协议protocolbuf。2.功能强大支持各种JDK类型。包括基本类型、JavaBean、Collection、Ma

    2022年6月20日
    139
  • ubuntu16安装中文输入法_ubuntu输入法安装

    ubuntu16安装中文输入法_ubuntu输入法安装本文安装谷歌输入法。使用一段时间后发现,谷歌输入法用起来极舒服,比sougouforlinux好用多了。记得谷歌的中文输入法主要是北京分部在做,对googlecn的好感度飙升!!!安装fcitx-googlepinyin(Ctrl+Alt+T打开终端,输入)sudoapt-getinstallfcitx-googlepinyin输入密码开始安装(输入密码的时候光标是不会移动的,不会有对应密码的***这样的星号出来,只管输完密码按回车就行),命令行会停在[y/n]的确认行,输入y并

    2022年9月25日
    4
  • 为什么香港服务器可以免备案

    为什么香港服务器可以免备案呢?这可能是许多朋友都回答不上来的话题,即使是经常使用香港服务器的用户也有部分人不清楚,那么今天我们就聊聊为什么香港服务器可以免备案:众所周知,我们国家实行的一国两制,所以香港地区在管理制度方面会和我们国内的不太一样,不仅是管理制度,包括法律,互联网使用规则也不一样。在国内,根据我国的互联网规定,网站所有者必须向国家有关部门申请实名备案,甚至部分网站还需要完成公安部备案,才能正常使用域名访问网站,且国内为净化互联网,也对许多内容进行限制;而香港则没有必须申请备案的要求,只要网站

    2022年4月8日
    69

发表回复

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

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