收藏 分销(赏)

ABP开发教程.doc

上传人:pc****0 文档编号:7601074 上传时间:2025-01-10 格式:DOC 页数:201 大小:934.37KB 下载积分:10 金币
下载 相关 举报
ABP开发教程.doc_第1页
第1页 / 共201页
ABP开发教程.doc_第2页
第2页 / 共201页


点击查看更多>>
资源描述
ABP Framework入门开发指南 领域驱动设计(DDD)红宝书 修订版本号:1.0.0.0 ABP框架中国小组(ABPFrameWorkGroup)@版权所有 2015-06-11 ABP Framework入门开发指南 序 言 天道 该开发指南基于ABP Framework官方文档,由ABP框架中国小组(ABPFrameWorkGroup)翻译。ABP框架中国小组在Github的地址为: 以后,最新的ABPFrameWork档,ABPFrameWork实例教程,以及代码都通过Github的ABP框架中国小组(ABPFrameWorkGroup)发布,请大家关注。 ABP官方文档翻译征集启动以来,得到了大家的热烈响应,先后共有10多名群友参与了翻译,目前翻译工作已经安排完毕,再次感谢广大群友的热烈支持。毫无疑问,该开发指南的发布是一次团体智慧和协作的结晶,是”ABP框架中国小组”共同努力的成果。我们应当感谢他们的默默付出,感谢他们在这个酷热的夏天依旧能够挥洒着汗水辛苦的工作。 此次的翻译工作完全是个人自主行为,旨在帮助那些学习.NET架构和研究领域驱动设计(DDD)的开发者们。我们有理由相信,通过学习官方文档并结合ABP的源码,大家的.NET水平必定有所提高。 该文档不仅是ABP的开发指南,也是.NET架构设计的一个优秀参考范本,指南中提及的各种封装和技术实现,也可以很方便的集成到自己的项目中去。因此,这里推荐大家在研究源码的时候,遇到问题可以首先参考一下这本指南。 l 关于此次翻译的标准如下: (1) 保留了原文的大部分关键词,这样方便大家以后学习这些常见词汇。 (2) 翻译的人称有第一人称和第二人称,由于时间关系,来不及统一。我个人倾向于第一人称,因此对部分群友的翻译做了调整。 (3) 对部分翻译的语法做了调整,并且更加符合中国人的习惯。 (4) 翻译总体上保留了原文的风格,大家可以对比一下原文,这不失为一个学习英语的最佳实践。 (5) 对于常见词汇,翻译统一了标准:如,derived翻译为派生,be used to翻译为“调用”而不是“被用来”,implement翻译为实现,等等。这里不在叙述。 l 关于ABP快速开发框架及实战: (1) 接下来ABP群会推出实例演示视频以及在线培训等。 (2)此外会根据大家的使用情况推出集成权限、用户、角色的基本开发框架。 (3)针对企业的开发者,我们将会推出高级版开发框架。 欢迎大家关注群主(上海 -阳铭)的博客: ABP架构设计交流群:134710707 ABP框架中国小组(ABPFrameWorkGroup)成员如下(排名不分先后,随机排列): l 山东-李伟 303283209 l 台灣-小張 2987853943 l 厦门-浩歌 385650059 l 深圳-Carl 280141563 l 冰封 121087772 l NoZero 3921342 l 南京-菜刀 252900664 l 深圳-Leo 254213048 l 成都-乐忧 68336713 l 上海-半冷 562758404 l 上海-阳铭 614573519 l 东莞-天道 1832339824 总排版:北京-北北 34665992 总审核:上海-阳铭 614573519 总编辑:东莞-天道 1832339824 由于个人技术水平和英文水平也是有限的,因此错误在所难免。希望大家多多指正。有错误或其他疑问的,请联系天道:1832339824@ 东莞-天道 于2015年6月13日星期六晚20点 ABP框架中国小组(ABPFrameWorkGroup) 版权所有 | 版本:1.0 ABP Framework入门开发指南 目 录 1 ABP总体介绍 1 1.1 入门介绍 1 1.1.1 ABP采用了以下技术 2 1.1.2 ABP框架已实现了以下特性 2 1.1.3 ABP适用的场景 4 1.2 多层架构体系 4 1.2.1 前言 4 1.2.2 ABP的体系结构 5 1.2.3 领域层 5 1.2.4 应用层 6 1.2.5 基础设施层 6 1.2.6 WEB与展现层 6 1.2.7 其它 7 1.3 模块系统 7 1.3.1 ABP模块系统简介 7 1.3.2 生命期事件 8 1.3.3 模块依赖 9 1.3.4 自定义的模块方法 10 1.4 启动配置 11 1.4.1 配置ABP 11 1.4.2 配置模块 13 1.4.3 为一个模块创建配置 13 2 ABP公共结构 16 2.1 ABP依赖注入 16 2.1.1 传统方式的问题 16 2.1.2 解决方案 18 2.1.3 依赖注入框架 20 2.1.4 ABP依赖注入的基础结构 21 2.1.5 附件 25 2.2 ABP会话管理 26 2.2.1 简介 26 2.2.2 注入会话 27 2.2.3 使用会话属性 27 2.3 ABP日志管理 28 2.3.1 服务器端 28 2.3.2 客户端 32 2.4 ABP设置管理 32 2.4.1 介绍 32 2.4.2 定义设置 33 2.4.3 设置范围 34 2.4.4 获取设置值 35 2.4.5 更改设置 36 2.4.6 关于缓存 36 3 ABP领域层 37 3.1 ABP领域层—实体 37 3.1.1 实体类 37 3.1.2 接口约定 38 3.1.3 IEntity接口 41 3.2 ABP领域层—仓储 42 3.2.1 IRepository接口 42 3.2.2 仓储的实现 47 3.2.3 管理数据库连接 48 3.2.4 仓储的生命周期 48 3.2.5 仓储的最佳实践 48 3.3 ABP领域层—工作单元 49 3.3.1 通用连接和事务管理方法 49 3.3.2 ABP的连接和事务管理 50 3.3.3 工作单元 53 3.3.4 选项 56 3.3.5 方法 57 3.3.6 事件 57 3.4 ABP领域层—数据过滤器 58 3.4.1 介绍 58 3.4.2 预定义过滤器 58 3.4.3 禁用过滤器 60 3.4.4 启用过滤器 61 3.4.5 设定过滤器参数 62 3.4.6 自定义过滤器 62 3.4.7 其它对象关系映射工具 64 3.5 ABP领域层—领域事件 64 3.5.1 事件总线 64 3.5.2 定义事件 65 3.5.3 触发事件 65 3.5.4 事件处理 66 3.5.5 注册处理器 68 3.5.6 取消注册事件 69 4 ABP应用层 71 4.1 ABP应用层—应用服务 71 4.1.1 IApplicationService接口 71 4.1.2 应用服务类型 73 4.1.3 工作单元 74 4.1.4 应用服务的生命周期 76 4.2 ABP应用层—数据传输对象 76 4.2.1 数据传输对象的作用 76 4.2.2 DTO 约定 & 验证 78 4.2.3 DTO和实体间的自动映射 80 4.2.4 辅助接口和类型 82 4.3 ABP应用层—DTO有效性验证 82 4.3.1 使用数据注解 83 4.3.2 自定义检验 84 4.3.3 设置缺省值 85 4.4 ABP应用层—权限认证 86 4.4.1 定义权限 86 4.4.2 检查权限 87 4.5 ABP应用层—审计日志 90 4.5.1 配置 91 4.5.2 通过属性来启用和禁用审计日志 92 4.5.3 说明 93 5 ABP表现层 94 5.1 ABP展现层—动态WebApi层 94 5.1.1 建立动态web api 控制器 94 5.1.2 使用动态js代理 95 5.2 ABP展现层—本地化 97 5.2.1 程序语言 97 5.2.2 本地化源文件 98 5.2.3 获得一个本地化配置文件 100 5.2.4 总结 103 5.3 ABP展现层—Javascript函数库 103 5.3.1 AJAX 103 5.3.2 通知 107 5.3.3 消息 107 5.3.4 用户界面的繁忙提示 109 5.3.5 Js日志接口 110 5.3.6 Javascript公共方法 111 5.4 ABP展现层—导航栏 112 5.4.1 创建菜单 112 5.4.2 显示菜单 114 5.5 ABP展现层—异常处理 114 5.5.1 开启错误处理 115 5.5.2 非Ajax请求 115 5.5.3 AJAX请求 117 5.5.4 异常事件 118 5.6 ABP展现层—嵌入资源文件 118 6 ABP基础设施层 119 6.1 ABP基础设施层—集成Entity Framework 119 6.1.1 Nuget包 119 6.1.2 创建DbContext 119 6.1.3 仓储 120 6.2 ABP基础设施层—集成NHibernate 124 6.2.1 Nuget包 125 6.2.2 配置 125 6.2.3 仓储实现 127 7 ABP实例一:ASP.NET Boilerplate 131 7.1 引子 131 7.2 什么是ASP.Net Boilerplate? 132 7.3 ABP不适用于那些场合? 133 7.4 开始 134 7.5 使用模板创建空的网站应用程序 134 7.6 领域层 136 7.6.1 实体-Entities 137 7.6.2 仓储-Repository 138 7.6.3 关于命名空间 139 7.7 基础设施层 139 7.7.1 数据库迁移 139 7.7.2 实体映射 143 7.7.3 仓储实现 143 7.8 应用层 145 7.8.1 应用服务及数据传输对象 145 7.8.2 DTO验证 149 7.8.3 动态Web API控制器 150 7.9 表现层 151 7.9.1 单页应用 152 7.9.2 视图和视图模型 152 7.9.3 本地化 160 7.9.4 JavaScript API 162 7.10 更多 164 7.10.1 模块系统 164 7.10.2 依赖注入和约定 165 7.11 结论 165 8 ABP实例二:单页面网站应用程序 167 8.1 简介 167 8.2 基于Abp创建应用程序 168 8.3 创建实体 169 8.4 创建DbContext 170 8.5 创建Database Migrations 171 8.6 定义仓储 173 8.7 实现仓储 174 8.8 构建应用程序服务 175 8.9 验证 179 8.10 异常处理 180 8.11 构建Web API 服务 181 8.12 开发单页面应用(SPA) 181 8.13 本地化 186 ABP框架中国小组(ABPFrameWorkGroup) 版权所有 | 版本:1.0 188 1 ABP总体介绍 1.1 入门介绍 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称。 ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应用程序的新起点,它旨在成为一个通用的WEB应用程序基础框架和项目模板。 ASP.NET Boilerplate 基于DDD的经典分层架构思想,实现了众多DDD的概念(但没有实现所有DDD的概念)。 ABP的官方网站: ABP在Github上的开源项目: ABP框架于2014年5月4日首次在Github开源,截止到2015年5月25日,总共进行了1271次代码提交,49次版本发布,现在的版本号是0.6.1.1。 1.1.1 ABP采用了以下技术 服务器端: l ASP.NET MVC 5、Web API 2、C# 5.0 l DDD领域驱动设计 (Entities、Repositories、Domain Services、Domain Events、Application Services、DTOs等) l Castle windsor (依赖注入容器) l Entity Framework 6 \ NHibernate,数据迁移 l Log4Net(日志记录) l AutoMapper(实现Dto类与实体类的双向自动转换) 客户端: l Bootstrap l Less l AngularJs l jQuery l Modernizr l 其他JS库: jQuery.validate、jQuery.form、jQuery.blockUI、json2 1.1.2 ABP框架已实现了以下特性 l 多语言/本地化支持 l 多租户支持(每个租户的数据自动隔离,业务模块开发者不需要在保存和查询数时写相应代码) l 软删除支持(继承相应的基类或实现相应接口,会自动实现软删除) l 统一的异常处理(应用层几乎不需要处理自己写异常处理代码) l 数据有效性验证(Asp.NET MVC只能做到Action方法的参数验证,ABP实现了Application层方法的参数有效性验证) l 日志记录(自动记录程序异常) l 模块化开发(每个模块有独立的EF DbContext,可单独指定数据库) l Repository仓储模式(已实现了Entity Framework、NHibernate、MangoDB、内存数据库) l Unit Of Work工作单元模式(为应用层和仓储层的方法自动实现数据库事务) l EventBus实现领域事件(Domain Events) l DLL嵌入资源管理 l 通过Application Services自动创建Web Api层(不需要写ApiController层了) l 自动创建Javascript 的代理层来更方便使用Web Api l 封装一些Javascript 函数,更方便地使用ajax、消息框、通知组件、忙状态的遮罩层 l “Zero”的模块,实现了以下功能: 身份验证与授权管理(通过ASP.NET Identity实现的) l 用户&角色管理 l 系统设置存取管理(系统级、租户级、用户级,作用范围自动管理) l 审计日志(自动记录每一次接口的调用者和参数) 我在其他项目中看到的很多优秀设计,在ABP项目中也已存在,而且可能实现得更好。ABP框架的代码,都通过xUnit进行了单元测试。作者一直在用ABP框架开发他们的实际项目,从Github和他官方论坛上的信息可以看到,有很多国外的开发者在将ABP用作生产项目的基础框架。如果需要直接使用ABP组件,可以通过Nuget安装(在VS的Nuget包管理界面搜索ABP)。 为了更好地将ABP适用于自己的项目,我对ABP的源码做了一些修改后使用的,没有直接使用ABP组件。 我希望更多国内的架构师能关注ABP这个项目,也许这其中有能帮助到你的地方,也许有你的参与,这个项目可以发展得更好。 今天只是作了一个大概介绍,希望有更多的朋友能去阅读源代码,然后参与讨论。 1.1.3 ABP适用的场景 中小规模WEB应用开发,可直接使用ABP框架。 较大型项目可以在ABP框架的源码基础上进行扩展,以实现分布式架构。 (处理高并发并不是ABP的强项。需要非常高并发的DDD框架,建议去研究netfocus的ENode。) 1.2 多层架构体系 1.2.1 前言 为了减少复杂性和提高代码的可重用性,采用分层架构是一种被广泛接受的技术。为了实现分层的体系结构,ABP遵循DDD(领域驱动设计)的原则,将工程分为四个层: l 展现层(Presentation):提供一个用户界面,实现用户交互操作。 l 应用层(Application):进行展现层与领域层之间的协调,协调业务对象来执行特定的应用程序的任务。它不包含业务逻辑。 l 领域层(Domain):包括业务对象和业务规则,这是应用程序的核心层。 l 基础设施层(Infrastructure):提供通用技术来支持更高的层。例如基础设施层的仓储(Repository)可通过ORM来实现数据库交互。 根据实际需要,可能会有额外添加的层。例如: l 分布式服务层(Distributed Service):用于公开应用程序接口供远程客户端调用。比如通过ASP.NET Web API或WCF来实现。这些都是常见的以领域为中心的分层体系结构。不同的项目在实现上可能会有细微的差别。 1.2.2 ABP的体系结构 一个简单的解决方案,大致包含5个项目: 每一层可以用一个或多个程序集来实现。 1.2.3 领域层 领域层就是业务层,是一个项目的核心,所有业务规则都应该在领域层实现。 实体(Entity) 实体代表业务领域的数据和操作,在实践中,通过用来映射成数据库表。 仓储(Repository) 仓储用来操作数据库进行数据存取。仓储接口在领域层定义,而仓储的实现类应该写在基础设施层。 领域服务(Domain service) 当处理的业务规则跨越两个(及以上)实体时,应该写在领域服务方法里面。 领域事件(Domain Event) 在领域层有些特定情况发生时可以触发领域事件,并且在相应地方捕获并处理它们。 工作单元(Unit of Work) 工作单元是一种设计模式,用于维护一个由已经被修改(如增加、删除和更新等)的业务对象组成的列表。它负责协调这些业务对象的持久化工作及并发问题。 1.2.4 应用层 应用层提供一些应用服务(Application Services)方法供展现层调用。一个应用服务方法接收一个DTO(数据传输对象)作为输入参数,使用这个输入参数执行特定的领域层操作,并根据需要可返回另一个DTO。在展现层到领域层之间,不应该接收或返回实体(Entity)对象,应该进行DTO映射。一个应用服务方法通常被认为是一个工作单元(Unit of Work)。用户输入参数的验证工作也应该在应用层实现。ABP提供了一个基础架构让我们很容易地实现输入参数有效性验证。建议使用一种像AutoMapper这样的工具来进行实体与DTO之间的映射。 1.2.5 基础设施层 当在领域层中为定义了仓储接口,应该在基础设施层中实现这些接口。可以使用ORM工具,例如EntityFramework或NHibernate。ABP的基类已经提供了对这两种ORM工具的支持。数据库迁移也被用于这一层。 1.2.6 WEB与展现层 Web层使用ASP.NET MVC和Web API来实现。可分别用于多页面应用程序(MPA)和单页面应用程序(SPA)。 在SPA中,所有资源被一次加载到客户端浏览器中(或者先只加载核心资源,其他资源懒加载),然后通过AJAX调用服务端WebApi接口获取数据,再根据数据生成HTML代码。不会整个页面刷新。现在已经有很多SPA的JS框架,例如: AngularJs、 DurandalJs、BackboneJs、EmberJs。 ABP可以使用任何类似的前端框架,但是ABP提供了一些帮助类,让我们更方便地使用AngularJs和DurandalJs。 在经典的多页面应用(MPA)中,客户端向服务器端发出请求,服务器端代码(ASP.NET MVC控制器)从数据库获得数据,并且使用Razor视图生成HTML。这些被生成后的HTML页面被发送回客户端显示。每显示一个新的页面都会整页刷新。 SPA和MPA涉及到完全不同的体系结构,也有不同的应用场景。一个管理后台适合用SPA,博客就更适合用MPA,因为它更利于被搜索引擎抓取。 SignalR是一种从服务器到客户端发送推送通知的完美工具。它能给用户提供丰富的实时的体验。 已经有很多客户端的Javascript框架或库,JQuery是其中最流行的,并且它有成千上万免费的插件。使用Bootstrap可以让我们更轻松地完成写Html和CSS的工作。 ABP也实现了根据Web API接口自动创建 Javascript的代码函数,来简化JS对Web Api的调用。还有把服务器端的菜单、语言、设置等生成到JS端。(但是在我自己的项目中,我是把这些自动生成功能关闭的,因为必要性不是很大,而这些又会比较影响性能)。 ABP会自动处理服务器端返回的异常,并以友好的界面提示用户。 1.2.7 其它 ABP使用Castle Windsor为整个程序框架提供依赖注入的功能。使用Log4Net日志记录组件,提供给其他各层调用以进行日志记录。 1.3 模块系统 1.3.1 ABP模块系统简介 ABP框架提供了创建和组装模块的基础,一个模块能够依赖于另一个模块。在通常情况下,一个程序集就可以看成是一个模块。在ABP框架中,一个模块通过一个类来定义,而这个类要继承自AbpModule。 l 译者注: 如果学习过Orchard的朋友,应该知道module模块的强大了。模块的本质就是可重用性,你可以在任意的地方去调用,而且通过实现模块,你写的模块也可以给别人用。.net可以通过反射获取一个程序集中的类以及方法。 Assembly程序集:Assembly是一个用来包含程序的名称,版本号,自我描述,文件关联关系和文件位置等信息的一个集合。最简单的理解就是:一个你自己写的类库生成的dll就可以看做是一个程序集,这个程序集可以包括很多类,类又包括很多方法等。 下面的例子,我们开发一个可以在多个不同应用中被调用MybolgApplication模块,代码如下: public class MyBlogApplicationModule : AbpModule //定义 { public override void Initialize() //初始化 { IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly()); //这行代码的写法基本上是不变的。它的作用是把当前程序集的特定类或接口注册到依赖注入容器中。 } } ABP框架会扫描所有的程序集,并且发现AbpModule类中所有已经导入的类,如果你已经创建了包含多个程序集的应用,对于ABP,我们的建议是为每一个程序集创建一个Module(模块)。 1.3.2 生命期事件 在一个应用中,ABP框架调用了Module模块的一些指定的方法来进行启动和关闭模块的操作。我们可以重载这些方法来完成我们自己的任务。 ABP框架通过依赖关系的顺序来调用这些方法,假如:模块A依赖于模块B,那么模块B要在模块A之前初始化,模块启动的方法顺序如下: 1) PreInitialize-B 2) PreInitialize-A 3) Initialize-B 4) Initialize-A 5) PostInitialize-B 6) PostInitialize-A 下面是具体方法的说明: l PreInitialize 预初始化:当应用启动后,第一次会调用这个方法。在依赖注入注册之前,你可以在这个方法中指定自己的特别代码。举个例子吧:假如你创建了一个传统的登记类,那么你要先注册这个类(使用IocManager对登记类进行注册),你可以注册事件到IOC容器。等。 l Initialize 初始化:在这个方法中一般是来进行依赖注入的注册,一般我们通过IocManager.RegisterAssemblyByConvention这个方法来实现。如果你想实现自定义的依赖注入,那么请参考依赖注入的相关文档。 l PostInitialize 提交初始化:最后一个方法,这个方法用来解析依赖关系。 l Shutdown 关闭:当应用关闭以后,这个方法被调用。 1.3.3 模块依赖 Abp框架会自动解析模块之间的依赖关系,但是我们还是建议你通过重载GetDependencies方法来明确的声明依赖关系。 [DependsOn(typeof(MyBlogCoreModule))]//通过注解来定义依赖关系 public class MyBlogApplicationModule : AbpModule { public override void Initialize() { IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly()); } } 例如上面的代码,我们就声明了MyBlogApplicationModule和MyBlogCoreModule的依赖关系(通过属性attribute),MyBlogApplicationModule这个应用模块依赖于MyBlogCoreModule核心模块,并且,MyBlogCoreModule核心模块会在MyBlogApplicationModule模块之前进行初始化。 1.3.4 自定义的模块方法 我们自己定义的模块中可能有方法被其他依赖于当前模块的模块调用,下面的例子,假设模块2依赖于模块1,并且想在预初始化的时候调用模块1的方法。这样,就把模块1注入到了模块2,因此,模块2就能调用模块1的方法了。 l 阳铭注: ABP的模块系统与Orchard的模块有类似之处,但还是有比较大的差别。Orchard的框架修改了ASP.NET程序集的默认加载方式(模块的DLL没有放在Bin文件夹下,是放在WEB项目根文件夹下面的Modules文件夹下),实现了功能模块的热插拔,而ABP的模块程序集还是放在Bin文件夹下的,没有实现热插拔。 public class MyModule1 : AbpModule { public override void Initialize() //初始化模块 { IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());//这里,进行依赖注入的注册。 } public void MyModuleMethod1() { //这里写自定义的方法。 } } [DependsOn(typeof(MyModule1))] public class MyModule2 : AbpModule { private readonly MyModule1 _myModule1; public MyModule2(MyModule1 myModule1) { _myModule1 = myModule1; } public override void PreInitialize() { _myModule1.MyModuleMethod1(); //调用MyModuleMethod1的方法。 } public override void Initialize() { IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly()); } } 1.4 启动配置 在应用启动之前,abp框架提供了模块基本的配置和方法,大家参照下面这个例子就可以了。 l 译者注: 在看这一节的内容之前,建议大家先下载module-zero这个例子代码,这个例子就是一个用户和角色的模块,并且使用的实例。配置在每一个应用中都可能会有,比如你有一个网站,你要获取网站的一些自定义基本参数,比如logo位置,网站名称,上传文件大小等等。模块化的配置方式和我们之前的做法肯定是不同的,大家要注意。之前无非就是一个方法getconfig从对应的表取数据,然后使用。 1.4.1 配置ABP 配置是通过在自己模块的PreInitialize方法中来实现的(对于module的PreInitialize方法,在上一篇中已经向大家做了简单的说明)代码示例如下: public class SimpleTaskSystemModule : AbpModule { public override void PreInitialize() { //在你的应用中添加语言包,这个是英语和作者的土耳其语。 Configuration.Localization.Languages.Add(new LanguageInfo("en", "English", "famfamfam-flag-england", true)); Configuration.Localization.Languages.Add(new LanguageInfo("tr", "Türkçe", "famfamfam-flag-tr")); Configuration.Localization.Sources.Add( new XmlLocalizationSource( "SimpleTaskSystem", HttpContext.Current.Server.MapPath("~/Localization/SimpleTaskSystem") ) ); //配置导航和菜单 Configuration.Navigation.Providers.Add<SimpleTaskSystemNavigationProvider>(); } public override void Initialize() { IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly()); } } 和orchard类似,abp框架一开始就被设计成模块化的,不同的模块可以通过abp框架来进行配置。举个例子吧,不同的模块都可以添加导航,通过导航添加菜单项到自己定义的主菜单,具体的细节大家可以参照: 本地化: 导航: 1.4.2 配置模块 和.net框架原生的启动配置相比较,abp有哪些不一样呢?abp框架的模块可以通过IAbpModuleConfigurations接口进行个性化的扩展,这样的话,模块配置更加简单、方便。 示例代码如下: using Abp.Web.Configuration; ... public override void PreInitialize() { Configuration.Modules.AbpWeb().SendAllExceptionsToClients = true; } 在上面这个例子中,我们通过配置AbpWeb模块,发送异常到客户端。当然了,不是每一个模块都需要这种配置,通常情况下我们需要,是当一个模块需要在多个不同的应用中重复使用,我们才进行这样的配置。 1.4.3 为一个模块创建配置 如下代码,假如我们有一个命名为MyModule的模块,并且这各模块有一些自己的配置。那么我们首先要创建一些类,这些类定义为属性(译者注:属性有自动的get和set访问器。),代表了不同的配置。 public class MyModuleConfig { public bool SampleConfig1 { get; set; } public string SampleConfig2 { get; set; } } 接下来,我们通过依赖注入,注册这个类。 IocManager.Register<MyModuleConfig>(); l 译者注: 在IocManager中注册了一个类,换句话说,我们通过IocManager可以得到这个类MyModuleConfig的实例。至于IOC的原理这里就不在详细说了,总之,就是可以得到一个类的实例。 最后,我们通过创建一个扩展的方法IModuleConfigurations来得到配置的引用。如下代码: l 译者注: 模块配置是一个静态类,因为我们需要重复使用它。静态方法Mymodule返回的是一个配置接口,参数是ImoduleConfigurations接口。 现在,在其他模块中也可以配置我们自定义的这个MyModule模块了。 Configuration.Modules.MyModule().SampleConfig1 = false; Configuration.Modules.MyModule().SampleConfig2 = "test"; 在某种意义上,MyModule需要这些配置,通过注射MyModuleConfig我们就可以使用这些值。 public class MyService : ITransientDependency { private readonly MyModuleConfig _configuration; public MyService(MyModuleConfig configuration) { _configuration = configuration; } public void DoIt() { if (_configuration.SampleConfig2 == "test") { //... } } } 这意味着,在abp框架的系统中,所有的模块都可以集中配置。
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 百科休闲 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服