首页 ABP开发教程

ABP开发教程

举报
开通vip

ABP开发教程ABPFramework入门开发指南领域驱动设计(DDD)红宝书修订版本号:1.0.0.0ABP框架中国小组(ABPFrameWorkGroup)@版权所有2015-06-11序言天道该开发指南基于ABPFramework官方文档,由ABP框架中国小组(ABPFrameWorkGroup)翻译。ABP框架中国小组在Github的地址为:HYPERLINK"https://github.com/ABPFrameWorkGroup"https://github.com/ABPFrameWorkGroup,大家可以...

ABP开发教程
ABPFramework入门开发指南领域驱动设计(DDD)红宝书修订版本号:1.0.0.0ABP框架中国小组(ABPFrameWorkGroup)@版权所有2015-06-11序言天道该开发指南基于ABPFramework官方文档,由ABP框架中国小组(ABPFrameWorkGroup)翻译。ABP框架中国小组在Github的地址为:HYPERLINK"https://github.com/ABPFrameWorkGroup"https://github.com/ABPFrameWorkGroup,大家可以在该地址下载最新的翻译文档并加入讨论。以后,最新的ABPFrameWork档,ABPFrameWork实例教程,以及代码都通过Github的ABP框架中国小组(ABPFrameWorkGroup)发布,请大家关注。ABP官方文档翻译征集启动以来,得到了大家的热烈响应,先后共有10多名群友参与了翻译,目前翻译工作已经安排完毕,再次感谢广大群友的热烈支持。毫无疑问,该开发指南的发布是一次团体智慧和协作的结晶,是”ABP框架中国小组”共同努力的成果。我们应当感谢他们的默默付出,感谢他们在这个酷热的夏天依旧能够挥洒着汗水辛苦的工作。此次的翻译工作完全是个人自主行为,旨在帮助那些学习.NET架构和研究领域驱动设计(DDD)的开发者们。我们有理由相信,通过学习官方文档并结合ABP的源码,大家的.NET水平必定有所提高。该文档不仅是ABP的开发指南,也是.NET架构设计的一个优秀参考范本,指南中提及的各种封装和技术实现,也可以很方便的集成到自己的项目中去。因此,这里推荐大家在研究源码的时候,遇到问题可以首先参考一下这本指南。关于此次翻译的标准如下:保留了原文的大部分,这样方便大家以后学习这些常见词汇。翻译的人称有第一人称和第二人称,由于时间关系,来不及统一。我个人倾向于第一人称,因此对部分群友的翻译做了调整。对部分翻译的语法做了调整,并且更加符合中国人的习惯。翻译总体上保留了原文的风格,大家可以对比一下原文,这不失为一个学习英语的最佳实践。对于常见词汇,翻译统一了标准:如,derived翻译为派生,beusedto翻译为“调用”而不是“被用来”,implement翻译为实现,等等。这里不在叙述。关于ABP快速开发框架及实战:接下来ABP群会推出实例演示视频以及在线 培训 焊锡培训资料ppt免费下载焊接培训教程 ppt 下载特设培训下载班长管理培训下载培训时间表下载 等。(2)此外会根据大家的使用情况推出集成权限、用户、角色的基本开发框架。(3)针对企业的开发者,我们将会推出高级版开发框架。欢迎大家关注群主(上海 -阳铭)的博客:HYPERLINK"http://www.cnblogs.com/mienreal"http://www.cnblogs.com/mienrealABP架构设计交流群:134710707ABP框架中国小组(ABPFrameWorkGroup)成员如下(排名不分先后,随机排列):山东-李伟303283209台灣-小張2987853943厦门-浩歌385650059深圳-Carl280141563冰封121087772NoZero3921342南京-菜刀252900664深圳-Leo254213048成都-乐忧68336713上海-半冷562758404上海-阳铭614573519东莞-天道1832339824总排版:北京-北北34665992总审核:上海-阳铭614573519总编辑:东莞-天道1832339824由于个人技术水平和英文水平也是有限的,因此错误在所难免。希望大家多多指正。有错误或其他疑问的,请联系天道:HYPERLINK"mailto:1832339824@qq.com"1832339824@qq.com东莞-天道于2015年6月13日星期六晚20点 目录 工贸企业有限空间作业目录特种设备作业人员作业种类与目录特种设备作业人员目录1类医疗器械目录高值医用耗材参考目录 TOC\o"3-3"\h\z\u\t"标题1,1,标题2,2"HYPERLINK\l"_Toc422348929"1ABP总体介绍PAGEREF_Toc422348929\h1HYPERLINK\l"_Toc422348930"1.1入门介绍PAGEREF_Toc422348930\h1HYPERLINK\l"_Toc422348931"1.1.1ABP采用了以下技术PAGEREF_Toc422348931\h2HYPERLINK\l"_Toc422348932"1.1.2ABP框架已实现了以下特性PAGEREF_Toc422348932\h2HYPERLINK\l"_Toc422348933"1.1.3ABP适用的场景PAGEREF_Toc422348933\h4HYPERLINK\l"_Toc422348934"1.2多层架构体系PAGEREF_Toc422348934\h4HYPERLINK\l"_Toc422348935"1.2.1前言PAGEREF_Toc422348935\h4HYPERLINK\l"_Toc422348936"1.2.2ABP的体系结构PAGEREF_Toc422348936\h5HYPERLINK\l"_Toc422348937"1.2.3领域层PAGEREF_Toc422348937\h5HYPERLINK\l"_Toc422348938"1.2.4应用层PAGEREF_Toc422348938\h6HYPERLINK\l"_Toc422348939"1.2.5基础设施层PAGEREF_Toc422348939\h6HYPERLINK\l"_Toc422348940"1.2.6WEB与展现层PAGEREF_Toc422348940\h6HYPERLINK\l"_Toc422348941"1.2.7其它PAGEREF_Toc422348941\h7HYPERLINK\l"_Toc422348942"1.3模块系统PAGEREF_Toc422348942\h7HYPERLINK\l"_Toc422348943"1.3.1ABP模块系统简介PAGEREF_Toc422348943\h7HYPERLINK\l"_Toc422348944"1.3.2生命期事件PAGEREF_Toc422348944\h8HYPERLINK\l"_Toc422348945"1.3.3模块依赖PAGEREF_Toc422348945\h9HYPERLINK\l"_Toc422348946"1.3.4自定义的模块方法PAGEREF_Toc422348946\h10HYPERLINK\l"_Toc422348947"1.4启动配置PAGEREF_Toc422348947\h11HYPERLINK\l"_Toc422348948"1.4.1配置ABPPAGEREF_Toc422348948\h11HYPERLINK\l"_Toc422348949"1.4.2配置模块PAGEREF_Toc422348949\h13HYPERLINK\l"_Toc422348950"1.4.3为一个模块创建配置PAGEREF_Toc422348950\h13HYPERLINK\l"_Toc422348951"2ABP公共结构PAGEREF_Toc422348951\h16HYPERLINK\l"_Toc422348952"2.1ABP依赖注入PAGEREF_Toc422348952\h16HYPERLINK\l"_Toc422348953"2.1.1传统方式的问题PAGEREF_Toc422348953\h16HYPERLINK\l"_Toc422348954"2.1.2解决方案PAGEREF_Toc422348954\h18HYPERLINK\l"_Toc422348955"2.1.3依赖注入框架PAGEREF_Toc422348955\h20HYPERLINK\l"_Toc422348956"2.1.4ABP依赖注入的基础结构PAGEREF_Toc422348956\h21HYPERLINK\l"_Toc422348957"2.1.5附件PAGEREF_Toc422348957\h25HYPERLINK\l"_Toc422348958"2.2ABP会话管理PAGEREF_Toc422348958\h26HYPERLINK\l"_Toc422348959"2.2.1简介PAGEREF_Toc422348959\h26HYPERLINK\l"_Toc422348960"2.2.2注入会话PAGEREF_Toc422348960\h27HYPERLINK\l"_Toc422348961"2.2.3使用会话属性PAGEREF_Toc422348961\h27HYPERLINK\l"_Toc422348962"2.3ABP日志管理PAGEREF_Toc422348962\h28HYPERLINK\l"_Toc422348963"2.3.1服务器端PAGEREF_Toc422348963\h28HYPERLINK\l"_Toc422348964"2.3.2客户端PAGEREF_Toc422348964\h32HYPERLINK\l"_Toc422348965"2.4ABP设置管理PAGEREF_Toc422348965\h32HYPERLINK\l"_Toc422348966"2.4.1介绍PAGEREF_Toc422348966\h32HYPERLINK\l"_Toc422348967"2.4.2定义设置PAGEREF_Toc422348967\h33HYPERLINK\l"_Toc422348968"2.4.3设置范围PAGEREF_Toc422348968\h34HYPERLINK\l"_Toc422348969"2.4.4获取设置值PAGEREF_Toc422348969\h35HYPERLINK\l"_Toc422348970"2.4.5更改设置PAGEREF_Toc422348970\h36HYPERLINK\l"_Toc422348971"2.4.6关于缓存PAGEREF_Toc422348971\h36HYPERLINK\l"_Toc422348972"3ABP领域层PAGEREF_Toc422348972\h37HYPERLINK\l"_Toc422348973"3.1ABP领域层—实体PAGEREF_Toc422348973\h37HYPERLINK\l"_Toc422348974"3.1.1实体类PAGEREF_Toc422348974\h37HYPERLINK\l"_Toc422348975"3.1.2接口约定PAGEREF_Toc422348975\h38HYPERLINK\l"_Toc422348976"3.1.3IEntity接口PAGEREF_Toc422348976\h41HYPERLINK\l"_Toc422348977"3.2ABP领域层—仓储PAGEREF_Toc422348977\h42HYPERLINK\l"_Toc422348978"3.2.1IRepository接口PAGEREF_Toc422348978\h42HYPERLINK\l"_Toc422348979"3.2.2仓储的实现PAGEREF_Toc422348979\h47HYPERLINK\l"_Toc422348980"3.2.3管理数据库连接PAGEREF_Toc422348980\h48HYPERLINK\l"_Toc422348981"3.2.4仓储的生命周期PAGEREF_Toc422348981\h48HYPERLINK\l"_Toc422348982"3.2.5仓储的最佳实践PAGEREF_Toc422348982\h48HYPERLINK\l"_Toc422348983"3.3ABP领域层—工作单元PAGEREF_Toc422348983\h49HYPERLINK\l"_Toc422348984"3.3.1通用连接和事务管理方法PAGEREF_Toc422348984\h49HYPERLINK\l"_Toc422348985"3.3.2ABP的连接和事务管理PAGEREF_Toc422348985\h50HYPERLINK\l"_Toc422348986"3.3.3工作单元PAGEREF_Toc422348986\h53HYPERLINK\l"_Toc422348987"3.3.4选项PAGEREF_Toc422348987\h56HYPERLINK\l"_Toc422348988"3.3.5方法PAGEREF_Toc422348988\h57HYPERLINK\l"_Toc422348989"3.3.6事件PAGEREF_Toc422348989\h57HYPERLINK\l"_Toc422348990"3.4ABP领域层—数据过滤器PAGEREF_Toc422348990\h58HYPERLINK\l"_Toc422348991"3.4.1介绍PAGEREF_Toc422348991\h58HYPERLINK\l"_Toc422348992"3.4.2预定义过滤器PAGEREF_Toc422348992\h58HYPERLINK\l"_Toc422348993"3.4.3禁用过滤器PAGEREF_Toc422348993\h60HYPERLINK\l"_Toc422348994"3.4.4启用过滤器PAGEREF_Toc422348994\h61HYPERLINK\l"_Toc422348995"3.4.5设定过滤器参数PAGEREF_Toc422348995\h62HYPERLINK\l"_Toc422348996"3.4.6自定义过滤器PAGEREF_Toc422348996\h62HYPERLINK\l"_Toc422348997"3.4.7其它对象关系映射工具PAGEREF_Toc422348997\h64HYPERLINK\l"_Toc422348998"3.5ABP领域层—领域事件PAGEREF_Toc422348998\h64HYPERLINK\l"_Toc422348999"3.5.1事件总线PAGEREF_Toc422348999\h64HYPERLINK\l"_Toc422349000"3.5.2定义事件PAGEREF_Toc422349000\h65HYPERLINK\l"_Toc422349001"3.5.3触发事件PAGEREF_Toc422349001\h65HYPERLINK\l"_Toc422349002"3.5.4事件处理PAGEREF_Toc422349002\h66HYPERLINK\l"_Toc422349003"3.5.5注册处理器PAGEREF_Toc422349003\h68HYPERLINK\l"_Toc422349004"3.5.6取消注册事件PAGEREF_Toc422349004\h69HYPERLINK\l"_Toc422349005"4ABP应用层PAGEREF_Toc422349005\h71HYPERLINK\l"_Toc422349006"4.1ABP应用层—应用服务PAGEREF_Toc422349006\h71HYPERLINK\l"_Toc422349007"4.1.1IApplicationService接口PAGEREF_Toc422349007\h71HYPERLINK\l"_Toc422349008"4.1.2应用服务类型PAGEREF_Toc422349008\h73HYPERLINK\l"_Toc422349009"4.1.3工作单元PAGEREF_Toc422349009\h74HYPERLINK\l"_Toc422349010"4.1.4应用服务的生命周期PAGEREF_Toc422349010\h76HYPERLINK\l"_Toc422349011"4.2ABP应用层—数据传输对象PAGEREF_Toc422349011\h76HYPERLINK\l"_Toc422349012"4.2.1数据传输对象的作用PAGEREF_Toc422349012\h76HYPERLINK\l"_Toc422349013"4.2.2DTO约定&验证PAGEREF_Toc422349013\h78HYPERLINK\l"_Toc422349014"4.2.3DTO和实体间的自动映射PAGEREF_Toc422349014\h80HYPERLINK\l"_Toc422349015"4.2.4辅助接口和类型PAGEREF_Toc422349015\h82HYPERLINK\l"_Toc422349016"4.3ABP应用层—DTO有效性验证PAGEREF_Toc422349016\h82HYPERLINK\l"_Toc422349017"4.3.1使用数据注解PAGEREF_Toc422349017\h83HYPERLINK\l"_Toc422349018"4.3.2自定义检验PAGEREF_Toc422349018\h84HYPERLINK\l"_Toc422349019"4.3.3设置缺省值PAGEREF_Toc422349019\h85HYPERLINK\l"_Toc422349020"4.4ABP应用层—权限认证PAGEREF_Toc422349020\h86HYPERLINK\l"_Toc422349021"4.4.1定义权限PAGEREF_Toc422349021\h86HYPERLINK\l"_Toc422349022"4.4.2检查权限PAGEREF_Toc422349022\h87HYPERLINK\l"_Toc422349023"4.5ABP应用层—审计日志PAGEREF_Toc422349023\h90HYPERLINK\l"_Toc422349024"4.5.1配置PAGEREF_Toc422349024\h91HYPERLINK\l"_Toc422349025"4.5.2通过属性来启用和禁用审计日志PAGEREF_Toc422349025\h92HYPERLINK\l"_Toc422349026"4.5.3说明PAGEREF_Toc422349026\h93HYPERLINK\l"_Toc422349027"5ABP表现层PAGEREF_Toc422349027\h94HYPERLINK\l"_Toc422349028"5.1ABP展现层—动态WebApi层PAGEREF_Toc422349028\h94HYPERLINK\l"_Toc422349029"5.1.1建立动态webapi控制器PAGEREF_Toc422349029\h94HYPERLINK\l"_Toc422349030"5.1.2使用动态js代理PAGEREF_Toc422349030\h95HYPERLINK\l"_Toc422349031"5.2ABP展现层—本地化PAGEREF_Toc422349031\h97HYPERLINK\l"_Toc422349032"5.2.1程序语言PAGEREF_Toc422349032\h97HYPERLINK\l"_Toc422349033"5.2.2本地化源文件PAGEREF_Toc422349033\h98HYPERLINK\l"_Toc422349034"5.2.3获得一个本地化配置文件PAGEREF_Toc422349034\h100HYPERLINK\l"_Toc422349035"5.2.4 总结 初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf PAGEREF_Toc422349035\h103HYPERLINK\l"_Toc422349036"5.3ABP展现层—Javascript函数库PAGEREF_Toc422349036\h103HYPERLINK\l"_Toc422349037"5.3.1AJAXPAGEREF_Toc422349037\h103HYPERLINK\l"_Toc422349038"5.3.2通知PAGEREF_Toc422349038\h107HYPERLINK\l"_Toc422349039"5.3.3消息PAGEREF_Toc422349039\h107HYPERLINK\l"_Toc422349040"5.3.4用户界面的繁忙提示PAGEREF_Toc422349040\h109HYPERLINK\l"_Toc422349041"5.3.5Js日志接口PAGEREF_Toc422349041\h110HYPERLINK\l"_Toc422349042"5.3.6Javascript公共方法PAGEREF_Toc422349042\h111HYPERLINK\l"_Toc422349043"5.4ABP展现层—导航栏PAGEREF_Toc422349043\h112HYPERLINK\l"_Toc422349044"5.4.1创建菜单PAGEREF_Toc422349044\h112HYPERLINK\l"_Toc422349045"5.4.2显示菜单PAGEREF_Toc422349045\h114HYPERLINK\l"_Toc422349046"5.5ABP展现层—异常处理PAGEREF_Toc422349046\h114HYPERLINK\l"_Toc422349047"5.5.1开启错误处理PAGEREF_Toc422349047\h115HYPERLINK\l"_Toc422349048"5.5.2非Ajax请求PAGEREF_Toc422349048\h115HYPERLINK\l"_Toc422349049"5.5.3AJAX请求PAGEREF_Toc422349049\h117HYPERLINK\l"_Toc422349050"5.5.4异常事件PAGEREF_Toc422349050\h118HYPERLINK\l"_Toc422349051"5.6ABP展现层—嵌入资源文件PAGEREF_Toc422349051\h118HYPERLINK\l"_Toc422349052"6ABP基础设施层PAGEREF_Toc422349052\h119HYPERLINK\l"_Toc422349053"6.1ABP基础设施层—集成EntityFrameworkPAGEREF_Toc422349053\h119HYPERLINK\l"_Toc422349054"6.1.1Nuget包PAGEREF_Toc422349054\h119HYPERLINK\l"_Toc422349055"6.1.2创建DbContextPAGEREF_Toc422349055\h119HYPERLINK\l"_Toc422349056"6.1.3仓储PAGEREF_Toc422349056\h120HYPERLINK\l"_Toc422349057"6.2ABP基础设施层—集成NHibernatePAGEREF_Toc422349057\h124HYPERLINK\l"_Toc422349058"6.2.1Nuget包PAGEREF_Toc422349058\h125HYPERLINK\l"_Toc422349059"6.2.2配置PAGEREF_Toc422349059\h125HYPERLINK\l"_Toc422349060"6.2.3仓储实现PAGEREF_Toc422349060\h127HYPERLINK\l"_Toc422349061"7ABP实例一:ASP.NETBoilerplatePAGEREF_Toc422349061\h131HYPERLINK\l"_Toc422349062"7.1引子PAGEREF_Toc422349062\h131HYPERLINK\l"_Toc422349063"7.2什么是ASP.NetBoilerplate?PAGEREF_Toc422349063\h132HYPERLINK\l"_Toc422349064"7.3ABP不适用于那些场合?PAGEREF_Toc422349064\h133HYPERLINK\l"_Toc422349065"7.4开始PAGEREF_Toc422349065\h134HYPERLINK\l"_Toc422349066"7.5使用模板创建空的网站应用程序PAGEREF_Toc422349066\h134HYPERLINK\l"_Toc422349067"7.6领域层PAGEREF_Toc422349067\h136HYPERLINK\l"_Toc422349068"7.6.1实体-EntitiesPAGEREF_Toc422349068\h137HYPERLINK\l"_Toc422349069"7.6.2仓储-RepositoryPAGEREF_Toc422349069\h138HYPERLINK\l"_Toc422349070"7.6.3关于命名空间PAGEREF_Toc422349070\h139HYPERLINK\l"_Toc422349071"7.7基础设施层PAGEREF_Toc422349071\h139HYPERLINK\l"_Toc422349072"7.7.1数据库迁移PAGEREF_Toc422349072\h139HYPERLINK\l"_Toc422349073"7.7.2实体映射PAGEREF_Toc422349073\h143HYPERLINK\l"_Toc422349074"7.7.3仓储实现PAGEREF_Toc422349074\h143HYPERLINK\l"_Toc422349075"7.8应用层PAGEREF_Toc422349075\h145HYPERLINK\l"_Toc422349076"7.8.1应用服务及数据传输对象PAGEREF_Toc422349076\h145HYPERLINK\l"_Toc422349077"7.8.2DTO验证PAGEREF_Toc422349077\h149HYPERLINK\l"_Toc422349078"7.8.3动态WebAPI控制器PAGEREF_Toc422349078\h150HYPERLINK\l"_Toc422349079"7.9表现层PAGEREF_Toc422349079\h151HYPERLINK\l"_Toc422349080"7.9.1单页应用PAGEREF_Toc422349080\h152HYPERLINK\l"_Toc422349081"7.9.2视图和视图模型PAGEREF_Toc422349081\h152HYPERLINK\l"_Toc422349082"7.9.3本地化PAGEREF_Toc422349082\h160HYPERLINK\l"_Toc422349083"7.9.4JavaScriptAPIPAGEREF_Toc422349083\h162HYPERLINK\l"_Toc422349084"7.10更多PAGEREF_Toc422349084\h164HYPERLINK\l"_Toc422349085"7.10.1模块系统PAGEREF_Toc422349085\h164HYPERLINK\l"_Toc422349086"7.10.2依赖注入和约定PAGEREF_Toc422349086\h165HYPERLINK\l"_Toc422349087"7.11结论PAGEREF_Toc422349087\h165HYPERLINK\l"_Toc422349088"8ABP实例二:单页面网站应用程序PAGEREF_Toc422349088\h167HYPERLINK\l"_Toc422349089"8.1简介PAGEREF_Toc422349089\h167HYPERLINK\l"_Toc422349090"8.2基于Abp创建应用程序PAGEREF_Toc422349090\h168HYPERLINK\l"_Toc422349091"8.3创建实体PAGEREF_Toc422349091\h169HYPERLINK\l"_Toc422349092"8.4创建DbContextPAGEREF_Toc422349092\h170HYPERLINK\l"_Toc422349093"8.5创建DatabaseMigrationsPAGEREF_Toc422349093\h171HYPERLINK\l"_Toc422349094"8.6定义仓储PAGEREF_Toc422349094\h173HYPERLINK\l"_Toc422349095"8.7实现仓储PAGEREF_Toc422349095\h174HYPERLINK\l"_Toc422349096"8.8构建应用程序服务PAGEREF_Toc422349096\h175HYPERLINK\l"_Toc422349097"8.9验证PAGEREF_Toc422349097\h179HYPERLINK\l"_Toc422349098"8.10异常处理PAGEREF_Toc422349098\h180HYPERLINK\l"_Toc422349099"8.11构建WebAPI服务PAGEREF_Toc422349099\h181HYPERLINK\l"_Toc422349100"8.12开发单页面应用(SPA)PAGEREF_Toc422349100\h181HYPERLINK\l"_Toc422349101"8.13本地化PAGEREF_Toc422349101\h186ABP总体介绍入门介绍ABP是“ASP.NETBoilerplateProject(ASP.NET样板项目)”的简称。ASP.NETBoilerplate是一个用最佳实践和流行技术开发现代WEB应用程序的新起点,它旨在成为一个通用的WEB应用程序基础框架和项目模板。ASP.NETBoilerplate基于DDD的经典分层架构思想,实现了众多DDD的概念(但没有实现所有DDD的概念)。ABP的:ABP在Github上的开源项目:HYPERLINK"https://github.com/aspnetboilerplate"https://github.com/aspnetboilerplateABP框架于2014年5月4日首次在Github开源,截止到2015年5月25日,总共进行了1271次代码提交,49次版本发布,现在的版本号是0.6.1.1。ABP采用了以下技术服务器端:ASP.NETMVC5、WebAPI2、C#5.0DDD领域驱动设计(Entities、Repositories、DomainServices、DomainEvents、ApplicationServices、DTOs等)Castlewindsor(依赖注入容器)EntityFramework6\NHibernate,数据迁移Log4Net(日志记录)AutoMapper(实现Dto类与实体类的双向自动转换)客户端:BootstrapLessAngularJsjQueryModernizr其他JS库:jQuery.validate、jQuery.form、jQuery.blockUI、json2ABP框架已实现了以下特性多语言/本地化支持多租户支持(每个租户的数据自动隔离,业务模块开发者不需要在保存和查询数时写相应代码)软删除支持(继承相应的基类或实现相应接口,会自动实现软删除)统一的异常处理(应用层几乎不需要处理自己写异常处理代码)数据有效性验证(Asp.NETMVC只能做到Action方法的参数验证,ABP实现了Application层方法的参数有效性验证)日志记录(自动记录程序异常)模块化开发(每个模块有独立的EFDbContext,可单独指定数据库)Repository仓储模式(已实现了EntityFramework、NHibernate、MangoDB、内存数据库)UnitOfWork工作单元模式(为应用层和仓储层的方法自动实现数据库事务)EventBus实现领域事件(DomainEvents)DLL嵌入资源管理通过ApplicationServices自动创建WebApi层(不需要写ApiController层了)自动创建Javascript的代理层来更方便使用WebApi封装一些Javascript函数,更方便地使用ajax、消息框、通知组件、忙状态的遮罩层“Zero”的模块,实现了以下功能:身份验证与授权管理(通过ASP.NETIdentity实现的)用户&角色管理系统设置存取管理(系统级、租户级、用户级,作用范围自动管理)审计日志(自动记录每一次接口的调用者和参数)我在其他项目中看到的很多优秀设计,在ABP项目中也已存在,而且可能实现得更好。ABP框架的代码,都通过xUnit进行了单元测试。作者一直在用ABP框架开发他们的实际项目,从Github和他官方论坛上的信息可以看到,有很多国外的开发者在将ABP用作生产项目的基础框架。如果需要直接使用ABP组件,可以通过Nuget安装(在VS的Nuget包管理界面搜索ABP)。为了更好地将ABP适用于自己的项目,我对ABP的源码做了一些修改后使用的,没有直接使用ABP组件。我希望更多国内的架构师能关注ABP这个项目,也许这其中有能帮助到你的地方,也许有你的参与,这个项目可以发展得更好。今天只是作了一个大概介绍,希望有更多的朋友能去阅读源代码,然后参与讨论。ABP适用的场景中小规模WEB应用开发,可直接使用ABP框架。较大型项目可以在ABP框架的源码基础上进行扩展,以实现分布式架构。(处理高并发并不是ABP的强项。需要非常高并发的DDD框架,建议去研究focus的ENode。)多层架构体系前言为了减少复杂性和提高代码的可重用性,采用分层架构是一种被广泛接受的技术。为了实现分层的体系结构,ABP遵循DDD(领域驱动设计)的原则,将 工程 路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理 分为四个层:展现层(Presentation):提供一个用户界面,实现用户交互操作。应用层(Application):进行展现层与领域层之间的协调,协调业务对象来执行特定的应用程序的任务。它不包含业务逻辑。领域层(Domain):包括业务对象和业务规则,这是应用程序的核心层。基础设施层(Infrastructure):提供通用技术来支持更高的层。例如基础设施层的仓储(Repository)可通过ORM来实现数据库交互。根据实际需要,可能会有额外添加的层。例如:分布式服务层(DistributedService):用于公开应用程序接口供远程客户端调用。比如通过ASP.NETWebAPI或WCF来实现。这些都是常见的以领域为中心的分层体系结构。不同的项目在实现上可能会有细微的差别。ABP的体系结构一个简单的解决方案,大致包含5个项目:每一层可以用一个或多个程序集来实现。领域层领域层就是业务层,是一个项目的核心,所有业务规则都应该在领域层实现。实体(Entity)实体代表业务领域的数据和操作,在实践中,通过用来映射成数据库表。仓储(Repository)仓储用来操作数据库进行数据存取。仓储接口在领域层定义,而仓储的实现类应该写在基础设施层。领域服务(Domainservice)当处理的业务规则跨越两个(及以上)实体时,应该写在领域服务方法里面。领域事件(DomainEvent)在领域层有些特定情况发生时可以触发领域事件,并且在相应地方捕获并处理它们。工作单元(UnitofWork)工作单元是一种设计模式,用于维护一个由已经被修改(如增加、删除和更新等)的业务对象组成的列表。它负责协调这些业务对象的持久化工作及并发问题。应用层应用层提供一些应用服务(ApplicationServices)方法供展现层调用。一个应用服务方法接收一个DTO(数据传输对象)作为输入参数,使用这个输入参数执行特定的领域层操作,并根据需要可返回另一个DTO。在展现层到领域层之间,不应该接收或返回实体(Entity)对象,应该进行DTO映射。一个应用服务方法通常被认为是一个工作单元(UnitofWork)。用户输入参数的验证工作也应该在应用层实现。ABP提供了一个基础架构让我们很容易地实现输入参数有效性验证。建议使用一种像AutoMapper这样的工具来进行实体与DTO之间的映射。基础设施层当在领域层中为定义了仓储接口,应该在基础设施层中实现这些接口。可以使用ORM工具,例如EntityFramework或NHibernate。ABP的基类已经提供了对这两种ORM工具的支持。数据库迁移也被用于这一层。WEB与展现层Web层使用ASP.NETMVC和WebAPI来实现。可分别用于多页面应用程序(MPA)和单页面应用程序(SPA)。在SPA中,所有资源被一次加载到客户端浏览器中(或者先只加载核心资源,其他资源懒加载),然后通过AJAX调用服务端WebApi接口获取数据,再根据数据生成HTML代码。不会整个页面刷新。现在已经有很多SPA的JS框架,例如:AngularJs、DurandalJs、BackboneJs、EmberJs。ABP可以使用任何类似的前端框架,但是ABP提供了一些帮助类,让我们更方便地使用AngularJs和DurandalJs。在经典的多页面应用(MPA)中,客户端向服务器端发出请求,服务器端代码(ASP.NETMVC控制器)从数据库获得数据,并且使用Razor视图生成HTML。这些被生成后的HTML页面被发送回客户端显示。每显示一个新的页面都会整页刷新。SPA和MPA涉及到完全不同的体系结构,也有不同的应用场景。一个管理后台适合用SPA,博客就更适合用MPA,因为它更利于被搜索引擎抓取。SignalR是一种从服务器到客户端发送推送通知的完美工具。它能给用户提供丰富的实时的体验。已经有很多客户端的Javascript框架或库,JQuery是其中最流行的,并且它有成千上万免费的插件。使用Bootstrap可以让我们更轻松地完成写Html和CSS的工作。ABP也实现了根据WebAPI接口自动创建Javascript的代码函数,来简化JS对WebApi的调用。还有把服务器端的菜单、语言、设置等生成到JS端。(但是在我自己的项目中,我是把这些自动生成功能关闭的,因为必要性不是很大,而这些又会比较影响性能)。ABP会自动处理服务器端返回的异常,并以友好的界面提示用户。其它ABP使用CastleWindsor为整个程序框架提供依赖注入的功能。使用Log4Net日志记录组件,提供给其他各层调用以进行日志记录。模块系统ABP模块系统简介ABP框架提供了创建和组装模块的基础,一个模块能够依赖于另一个模块。在通常情况下,一个程序集就可以看成是一个模块。在ABP框架中,一个模块通过一个类来定义,而这个类要继承自AbpModule。译者注:如果学习过Orchard的朋友,应该知道module模块的强大了。模块的本质就是可重用性,你可以在任意的地方去调用,而且通过实现模块,你写的模块也可以给别人用。.可以通过反射获取一个程序集中的类以及方法。Assembly程序集:Assembly是一个用来包含程序的名称,版本号,自我描述,文件关联关系和文件位置等信息的一个集合。最简单的理解就是:一个你自己写的类库生成的dll就可以看做是一个程序集,这个程序集可以包括很多类,类又包括很多方法等。下面的例子,我们开发一个可以在多个不同应用中被调用MybolgApplication模块,代码如下:publicclassMyBlogApplicationModule:AbpModule//定义{publicoverridevoidInitialize()//初始化{IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());//这行代码的写法基本上是不变的。它的作用是把当前程序集的特定类或接口注册到依赖注入容器中。}}ABP框架会扫描所有的程序集,并且发现AbpModule类中所有已经导入的类,如果你已经创建了包含多个程序集的应用,对于ABP,我们的建议是为每一个程序集创建一个Module(模块)。生命期事件在一个应用中,ABP框架调用了Module模块的一些指定的方法来进行启动和关闭模块的操作。我们可以重载这些方法来完成我们自己的任务。ABP框架通过依赖关系的顺序来调用这些方法,假如:模块A依赖于模块B,那么模块B要在模块A之前初始化,模块启动的方法顺序如下:PreInitialize-BPreInitialize-AInitialize-BInitialize-APostInitialize-BPostInitialize-A下面是具体方法的说明:PreInitialize预初始化:当应用启动后,第一次会调用这个方法。在依赖注入注册之前,你可以在这个方法中指定自己的特别代码。举个例子吧:假如你创建了一个传统的登记类,那么你要先注册这个类(使用IocManager对登记类进行注册),你可以注册事件到IOC容器。等。Initialize初始化:在这个方法中一般是来进行依赖注入的注册,一般我们通过IocManager.RegisterAssemblyByConvention这个方法来实现。如果你想实现自定义的依赖注入,那么请参考依赖注入的相关文档。PostInitialize提交初始化:最后一个方法,这个方法用来解析依赖关系。Shutdown关闭:当应用关闭以后,这个方法被调用。模块依赖Abp框架会自动解析模块之间的依赖关系,但是我们还是建议你通过重载GetDependencies方法来明确的声明依赖关系。[DependsOn(typeof(MyBlogCoreModule))]//通过注解来定义依赖关系publicclassMyBlogApplicationModule:AbpModule{publicoverridevoidInitialize(){IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());}}例如上面的代码,我们就声明了MyBlogApplicationModule和MyBlogCoreModule的依赖关系(通过属性attribute),MyBlogApplicationModule这个应用模块依赖于MyBlogCoreModule核心模块,并且,MyBlogCoreModule核心模块会在MyBlogApplicationModule模块之前进行初始化。自定义的模块方法我们自己定义的模块中可能有方法被其他依赖于当前模块的模块调用,下面的例子,假设模块2依赖于模块1,并且想在预初始化的时候调用模块1的方法。这样,就把模块1注入到了模块2,因此,模块2就能调用模块1的方法了。阳铭注:ABP的模块系统与Orchard的模块有类似之处,但还是有比较大的差别。Orchard的框架修改了ASP.NET程序集的默认加载方式(模块的DLL没有放在Bin文件夹下,是放在WEB项目根文件夹下面的Modules文件夹下),实现了功能模块的热插拔,而ABP的模块程序集还是放在Bin文件夹下的,没有实现热插拔。publicclassMyModule1:AbpModule{publicoverridevoidInitialize()//初始化模块{IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());//这里,进行依赖注入的注册。}publicvoidMyModuleMethod1(){//这里写自定义的方法。}}[DependsOn(typeof(MyModule1))]publicclassMyModule2:AbpModule{privatereadonlyMyModule1_myModule1;publicMyModule2(MyModule1myModule1){_myModule1=myModule1;}publicoverridevoidPreInitialize(){_myModule1.MyModuleMethod1();//调用MyModuleMethod1的方法。}publicoverridevoidInitialize(){IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());}}启动配置在应用启动之前,abp框架提供了模块基本的配置和方法,大家参照下面这个例子就可以了。译者注:在看这一节的内容之前,建议大家先下载module-zero这个例子代码,这个例子就是一个用户和角色的模块,并且使用的实例。配置在每一个应用中都可能会有,比如你有一个,你要获取的一些自定义基本参数,比如位置,名称,上传文件大小等等。模块化的配置方式和我们之前的做法肯定是不同的,大家要注意。之前无非就是一个方法getconfig从对应的表取数据,然后使用。配置ABP配置是通过在自己模块的PreInitialize方法中来实现的(对于module的PreInitialize方法,在上一篇中已经向大家做了简单的说明)代码示例如下:publicclassSimpleTaskSystemModule:AbpModule{publicoverridevoidPreInitialize(){//在你的应用中添加语言包,这个是英语和作者的土耳其语。Configurat
本文档为【ABP开发教程】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: ¥11.9 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
很爱问
暂无简介~
格式:doc
大小:890KB
软件:Word
页数:0
分类:
上传时间:2021-08-22
浏览量:89