eXpressApp Framework > Concepts > Application Model > 应用程序结构基础
业务应用程序是复杂的工程。从头开始建立一个应用程序,你不得不实现数据存储、数据可视化、业务逻辑、等等。使用XAF只需要实现业务模型。默认自动生成应用程序界面。为此,XAF应用程序界面模型结构信息用了一个特殊的数据存储。在它是基于应用程序中代码(定义的类)和引用模块生成的。本篇详述如何收集应用程序模型信息和如何用它自定义默认应用程序界面。
应用程序模型结构
当你运行一个Windows Forms或者ASP.NET应用程序时,应用程序模型将建立界面元素。例如,当框架建立一个列表显示一些联系人对象,每列的显示,本地化,标题和其它设置都由应用程序模型生成。应用程序模型提供了详细的业务类,控制器,按钮,属性编辑和其它有影响的应用程序功能。
应用程序模型信息呈树形显示。树节点通常有一组属性,实际上指定的应用程序模型数据。规则,根据该节点及其属性在模型中的组织,是由应用程序模型结构定义的。默认情况下,应用程序模型是有如下组织方法:根节点(应用程序)和几个子节点(按钮设计,业务模型,创建项目,图片资源,导航项目,详细视图项目,视图,等等)。
有关这些节点的详细介绍,参考应用程序模型架构帮助主题
有关生成业务模型和视图的详细信息,参考应用程序模型中的业务模型帮助主题
你可以在代码中访问应用程序模型。如何这样做,参考在代码中访问应用程序模型。
你可以用代码改变或扩展应用程序模型。如何这样做请参考:用代码自定义和扩展应用程序模型。
应用程序模型生成
应用程序模型不是立即完全生成。每个部分都是在需要时才生成。例如,如果某视图没被调用在运行应用程序时,它的节点并没有产生。这种“懒惰计算”的方法可以显着提高性能。
在内部,应用程序模型有一个层状结构
- 基层,是零层。初始,是空的。在应用程序生命周期,它的数据是按需填充。这层的生成基于应用程序引用模块的代码。在In ASP.NET应用程序,零层用户会话之间共享,以减少内存消耗和提高性能。
- 更高,每个模块层的应用程序,代表的模块的XafML文件。此外,有一个层应用项目的XafML文件。
- 在顶部,是最终用户的自定义层,存储在Model.User.xafml文件或浏览器Cookie。
· 最后,主层。本身它不包含任何信息。它作为所有其它层的代理。通常,当你访问应用程序模型,你将处理的主层。
当需要从某个节点获取信息,该请求是针对主层。主层检查是否需求的信息已经在零层生成。如果不是,模型的需求部分则生成。然后主层要检查其它所有层,在零层叠加生产的信息,返回需求信息。如果层包含变量数据,如果有层包含不同数据,他们将汇集在最顶层。在中间层上的信息不能被修改。
当需要修改数据时,模型生成器将在顶层建立相应的模型块,保存改变的信息。
搜集用程序模型的节点信息,扫描所有工程项目中模型。信息从每个模块的代码搜集和扫描引用模块。
各个模块的扫描顺序下图所示:
图示例了一个简单的“MySolution”XAF Windows Forms应用程序需求的模块。MySolution模块需要BusinessClassLibraryCustomizationModule and SystemModule。MySolutionWindowsFormsModule模块需要MySolutionModule和SystemWindowsFormsModule。当生成应用程序模型时,首先扫描BusinessClassLibraryCustomizationModule和SystemModule模块。由于这些模块处于同级别引用,因此他们的扫描顺序不确定。SystemModule可能最先或最后,然后是MySolutionModule和SystemWindwosFormsModule。接着那些模块又处在相同的引用级别,扫描顺序不确定。最后扫描MySolutionWindwosFormsModule。
你可以在应用程序设计模块部分了解哪些模块需要在应用程序模型生成部分.它列出了所有添加到应用程序项目中的模块,等等。除了应用程序和模块设计,也有些替代方法添加模块。例如,你能在应用程序项目配置文件列出需求模块。详细情况请参考应用程序项目组件主题。所使用的应用程序模型生成的模块列表包括已添加,利用一切可能的办法。
自定义应用程序模型
· 生产应用程序模型的零层过程可以通过模型生成器自定义。当需要建立模型的一部分,模型生成器一次自动生成。模型生成器代表ModelNodesGeneratorBase后代,有GenerateNodesCore方法。所需的生产逻辑是实现此方法。每个模型生成器有几个模型生成器更新者附加。模型生成更新者代表ModelNodesGeneratorUpdater<T>的后代,和可用于执行其他自定义模型生成的一部分。看如何实现模型生成器和更新者,参考用代码扩展和自定义应用程序模型主题。
· To customize the Application Model at a certain Module's level, you can use the Model Editor invoked at design time. These customizations will be stored it the Module's XAFML file.
· 在某一个模块级自定义应用程序模型,你能在设计时用模型编辑器。模块中的XAFML文件存储这些自定义配置。
你可以在任何地方非常容易的撤销更改,撤销到初始值(最后,你能存储自动生成模型)。移除更改,简单的删除相应XafML文件。当然,你也可以在模型编辑器中只删除指定的改变(通过复位差异上下文菜单),或者通过编辑XafML文件。用MS Visual Studio打开一个XafML文件,选中右键单击再选择View Code。不同之处是XML格式。你可以很容的找需求更多或移除的节点或属性。不过我们建议你尽可能用模型编辑器,而不是直接编辑Xafml文件。
备注
使用应用程序模型改变设置,可以在代码中更改的设置(见内置属性)是不推荐的。例如,如果你重命名一个类,你所做的所有更改,将在应用程序模型中丢失。也建议你到该模块项目改变模型。如果你为一个应用程序项目工程自定义一个模型,你所做的改变不能应用到其他应用程序基于相同的逻辑。
· 最后,终端用户,可以自定义应用程序模型,可以直接更改,也可以在运行时通过模型编辑器更改,或者间接修改布局,更改皮肤,等等。终端用户自定义信息在Windows Forms应用程序中存储在Model.User.Xafml文件中,或者在ASP.NET 应用程序中存储在cookies中。