一个典型AAF应用由如下几个部分组成:
1)一组配置文件,其中最基本的是Boot.Config,通过该文件声明应用所需要的各服务接口及其实现
2)AAF基本服务定义及其实现Assembly/程序集
3)应用自定义的服务定义及其实现Assembly/程序集
4)一个恰当的服务集加载点。一般来说,Web应用应该在Application.OnStart实践处理方法中直接或间接调用Aaf.Core.ServiceHub.Init(false);Windows应用则应该在Main方法中直接或间接调用前述方法。

下面我们稍作展开,对Boot.Config以及AAF应用的启动过程进行较为详细的介绍。
我们首先看一下一个典型的Boot.Config文件:
<?xml version=”1.0″ encoding=”utf-8″ ?>
<Boot>
<Services>
<Service Type=”Aaf.Agile.ITypeService, Aaf.Agile” Driver=”Aaf.Agile.Imp.TypeService, Aaf.Agile.Imp”/>
<Service Type=”Aaf.Persistence.IStorageContextMappingService, Aaf.Persistence” Driver=”Aaf.Persistence.Imp.StorageContextMappingService, Aaf.Persistence.Imp”/>
<Service Type=”Aaf.Persistence.IPersistenceMappingService, Aaf.Persistence” Driver=”Aaf.Persistence.Imp.PersistenceMappingService, Aaf.Persistence.Imp”/>
<Service Type=”Aaf.Persistence.IPersister, Aaf.Persistence” Driver=”Aaf.Persistence.Imp.Persister, Aaf.Persistence.Imp”/>
<Service Type=”Aaf.Persistence.IAgileObjectXmlService, Aaf.Persistence” Driver=”Aaf.Persistence.Imp.AgileObjectXmlService, Aaf.Persistence.Imp”/>
<Service Type=”Aaf.Storage.IStorageService, Aaf.Storage” Driver=”Aaf.Storage.Imp.StorageService, Aaf.Storage.Imp”/>
<Service Type=”Aaf.Core.ICacheService, Aaf.Core” Driver=”Aaf.Cache.Imp.CacheService, Aaf.Cache.Imp”/>
<Service Type=”Aaf.Core.IConfigurationService, Aaf.Core” Driver=”Aaf.Core.Imp.ConfigurationService, Aaf.Core.Imp”/>
<Service Type=”Aaf.Core.IApplicationService, Aaf.Core” Driver=”Aaf.Core.Imp.ApplicationService, Aaf.Core.Imp”/>
<Service Type=”Aaf.Core.ITimeStampService, Aaf.Core” Driver=”Aaf.Core.Imp.TimeStampService, Aaf.Core.Imp”/>
<Service Type=”Aaf.Query.IQueryService, Aaf.Query” Driver=”Aaf.Query.Imp.QueryService, Aaf.Query.Imp”/>
<Service Type=”Aaf.SyncProxy.ISyncServiceProxy, Aaf.SyncProxy” Driver=”Aaf.SyncProxy.Imp.SyncServiceProxy, Aaf.SyncProxy.Imp”/>
<Service Type=”Aaf.Para.IParaService, Aaf.Para” Driver=”Aaf.Para.Imp.ParaService, Aaf.Para.Imp”/>
<Service Type=”Aaf.UiHelper.IDataReaderVisualizer, Aaf.UiHelper” Driver=”Aaf.UiHelper.Imp.DataReaderVisualizer, Aaf.UiHelper.Imp”/>
<Service Type=”Aaf.Org.IOrgService, Aaf.Org” Driver=”Aaf.Org.Imp.OrgService, Aaf.Org.Imp”/>
<Service Type=”XX.Core.IQueryDriver, XX.Core” Driver=”XX.Core.Imp.QueryDriver, XX.Core.Imp.QueryDriver”/>
<Service Type=”XX.Core.ISiteService, XX.Core” Driver=”XX.Core.Imp.SiteService, XX.Core.Imp”/>
<Service Type=”XX.Core.IBizOfferService, XX.Core” Driver=”XX.Core.Imp.BizOfferService, XX.Core.Imp”/>
<Service Type=”XX.Core.IUserService, XX.Core” Driver=”XX.Core.Imp.UserService, XX.Core.Imp”/>
<Service Type=”XX.Core.IGameService, XX.Core” Driver=”XX.Core.Imp.GameService, XX.Core.Imp”/>
<Service Type=”XX.Core.ICouponService, XX.Core” Driver=”XX.Core.Imp.CouponService, XX.Core.Imp.Payment”/>
<Service Type=”XX.Core.IPaymentService, XX.Core” Driver=”XX.Core.Imp.PaymentService, XX.Core.Imp.Payment”/>
<Service Type=”XX.Core.IOrderService, XX.Core” Driver=”XX.Core.Imp.OrderService, XX.Core.Imp.Payment”/>
</Services>
</Boot>

Boot.Config文件在“Boot/Services”路径下逐个定义了应用所需的各服务。每一个服务定义由Type和Driver两个属性 组成。前者描述了一个服务的接口名称(包含namespace前缀以及通过逗号分割的接口所在程序集/Assembly名后缀),后者指定了该接口的实现 (类似的,包含namespace前缀以及通过逗号分割的接口实现所在程序集/Assembly名后缀)。在 ServiceHub.Init(false)的执行过程中,系统将根据Boot.Config的约定自动创建各服务实例并对各服务按照预定的步调进行初 始化。当个服务初始化完成后,应用即进入与非AAF应用类似的正常运行阶段,所不同的该阶段的AAF应用可以通过 Aaf.Core.ServiceHub.Instance.GetService()方法获得各服务实例并通过服务提供的方法、属性使用该服务提供的各 种功能。在调用GetService方法时,调用方秩序传入所需服务的接口类型,而无需关心服务的实现指向。比如,如果我们想获得持久化服务,就只需如下 代码:
Aaf.Persistence.IPersister persister = (Aaf.Persistence.IPersister)Aaf.Core.ServiceHub.Instance.GetService(typeof(Aaf.Persistence.IPersister));

AAF服务的基本初始化步调如下:
1)Init(调用各服务的IService.Init方法)
2)Load(调用各服务的IService.Load方法)
3)Prepare(调用各服务的IService.Prepare/PrepareInternal方法)
4)Run(调用各服务的IService.Run方法)
在第一步和第二步,服务一般不应访问其它服务(除了个别预加载服务,如日志服务:IRuntimeLogService,可以通过调用 ServiceHub.AddLog方法间接调用该服务的相关方法),在Prepare阶段,服务A可以借助其它服务进行初始化,但是必须首先确保所需服 务B已经成功完成Prepare(通过该服务通过IService接口提供的IsPrepared属性。这里强调一点,所有服务接口都没有集成 IService,所以如果试图通过服务实现访问IService时,需要进行强制装换,如:if (((Aaf.Core.IService)persister).IsPreapred) …)
,否则服务A必须暂时放弃Prepare的执行并在PrepareInternal方法中返回false。内核会继续尝试其它服务的初始化并在稍后重试服 务A的初始化。所有服务的Prepare阶段将不断重复这一过程直到所有服务Prepare都先后在某一次调用后返回true(此时系统会自动将 IsPrepared属性设置为true)或者所有可以Prepare的服务都已执行完毕只剩下几个因为不恰当的相互依赖或者其他原因总也无法 Prepare的方法为止。

一旦Prepare阶段树立完成,AAF内核将进入所有服务初始化的最后阶段:Run阶段。在Run阶段,各服务可以启动本服务执行所需的守候线程或者工作线程或者完成其它服务认为应该放在此阶段的任务。

当所有的服务都完成Run阶段后,AAF的初始化阶段就彻底完成了,AAF应用进入与普通应用类似的正常运行阶段。

转载于:https://www.cnblogs.com/hb_cattle/articles/1828979.html

[转载]AAF灵便应用框架简介系列(2):AAF应用的启动和初始化相关推荐

  1. 【Spring框架一】——Spring框架简介

    系列文章目录 Spring框架简介 系列文章目录 前言 一.什么是Spring框架? 二.Spring框架的优势 1.简化开发流程:Spring提供了许多现成的功能,可以使得开发人员在构建应用程序时减 ...

  2. JQuery Smart UI 简介(六) — 框架设计【后篇】(数据接口、后台框架)[简介系列完结]...

    上篇介绍了Smart UI的前台架构,本篇继续后面的内容 - Data Interface.Business Layout.DataAccess. Data Interface 数据接口,Smart ...

  3. (二)surging 微服务框架使用系列之surging 的准备工作consul安装(转载 https://www.cnblogs.com/alangur/p/8377977.html)...

    (二)surging 微服务框架使用系列之surging 的准备工作consul安装 suging 的注册中心支持consul跟zookeeper.因为consul跟zookeeper的配置都差不多, ...

  4. 《HiWind企业快速开发框架实战》(0)目录及框架简介

    <HiWind企业快速开发框架实战>(0)目录及框架简介 本系列主要介绍一款企业管理系统快速开发框架,该框架旨在快速完成企业管理系统,并实现易维护可移植的目标. 使用逐个系统模块进行编码的 ...

  5. freecplus框架简介

    文章目录 一.freecplus框架简介 二.freecplus开源许可协议 三.freecplus框架内容 字符串操作 2.xml解析 3.日期时间 4.目录操作 5.文件操作 6.日志文件 7.参 ...

  6. 01、freecplus框架简介

    文章目录 一.freecplus框架简介 二.freecplus开源许可协议 三.freecplus框架内容 字符串操作 2.xml解析 3.日期时间 4.目录操作 5.文件操作 6.日志文件 7.参 ...

  7. Java开源——常见J2EE框架简介

    Java开源--常见J2EE框架简介 Spring Framework Spring是一个解决了许多在J2EE开发中常见的问题的强大框架. Spring提供了管理业务对象的一致方法并且鼓励了注入对接口 ...

  8. Spring框架简介

    Spring框架简介 Spring Framework 是一个开源的Java/Java EE全功能栈(full-stack)的应用程序框架,以Apache许可证形式发布,也有.NET平台上的移植版本. ...

  9. Django框架简介

    Django框架简介 MVC框架和MTV框架 MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View) ...

最新文章

  1. 高精地图与自动驾驶(下)
  2. RedHat 7配置FTP服务
  3. linux内核技术文章
  4. 提高 Java 代码质量
  5. 网站运营之做到SEO操作视频教程【21讲】
  6. AngularJS2 环境搭建:
  7. linux生成数字命令,Linux下随机生成密码的命令
  8. Mybatis源码研究6:元数据(metadata)
  9. oracle中OEM证书失效怎么办,安全证书过期怎么办 网站安全证书失效处理【解决方法】...
  10. mysql备份恢复中的常见错误
  11. html标签种类很多,为什么不都用div?
  12. java httpclient读取html文件,httpclient+nekohtml 解析HTML
  13. TOGAF9.2 第I部分 第1章简介
  14. 考CFA证书只通过一级有用吗?
  15. 孟云飞 :一代通才 自成家数——赵之谦的艺术人生
  16. 简述CC2530晶振、振荡器与时钟
  17. 沙漠之花--华莉丝·迪里
  18. 【论文阅读】Heterogeneous Graph Attention Network
  19. 视频教程-Echarts+Asp.Net+Sql Server报表开发视频教程-.NET
  20. DETR与Deformable DETR小结

热门文章

  1. 关于浮动元素float使其父元素高度塌陷的原因及解决方法
  2. 中秋节,华为云AI送上超级大月亮制作教程,体验赢开发者键鼠套装
  3. 【docker】docker概述及基础入门
  4. dvi接口引脚定义_DVI接口详细图文介绍
  5. 时钟电路-负载电容和电阻计算
  6. flutter仿微信ui
  7. 我们是来自两个不同高度世界的人
  8. 揭秘中国联通5G应用“网红打卡地” !17个硬核5G案例一览!
  9. Transactional mybatis plus 不生效
  10. 经纬恒润以太网开发及测试方案,助力智能汽车落地