狠狠撸

狠狠撸Share a Scribd company logo
n-Layer Design & Development
Agenda 
? 引子、Why n-Layer、Why MVC 
? Domain、Data、DDFx 
? HelloDDFx Demo 
? Q & A
引子:以下哪些对于经典三层架构的描述是正确的? 
? 1、User Interface(UI)层一般指Web 前端,主要负责用户交互 
? 2、Business Logic(BL)层一般指业务逻辑,可以包括UI 逻辑 
? 3、Business Logic(BL)层一般指业务逻辑,不可以包括UI 逻辑 
? 4、Data Access(DA)层一般指数据访问,主要负责关系数据库 
交互 
? 5、三层架构的优势是把代码分散到不同模块中,以方便程序员 
编写不同的部分,实现代码重用
引子:以下哪些对于经典三层架构的描述是正确的? 
? 1、User Interface(UI)层一般指Web 前端,主要负责用户交互 
? 2、Business Logic(BL)层一般指业务逻辑,可以包括UI 逻辑 
? 3、Business Logic(BL)层一般指业务逻辑,不可以包括UI 逻辑 
? 4、Data Access(DA)层一般指数据访问,主要负责关系数据库 
交互 
? 5、三层架构的优势是把代码分散到不同模块中,以方便程序员 
编写不同的部分,实现代码重用
引子:对于简单& 复杂的3 条语录 
? 代码像首诗 
– Code is like a poem 
? 设计是一场与复杂性的战斗 
– We believe designing systems is a fight against complexity. 
– Most of the time the best way to fight complexity is by not creating it. 
? Coding 是件“艰苦”的事,唯一的办 
法是享受它;如果Coding 已不能带来 
快乐,就考虑“停止”它。
引子:应对复杂问题两大策略 
? Divide and Conquer (分而治之) 
– D&C 侧重战略 
– 典型案例:递归、Quick-Sort、Map-Reduce、etc. 
? Separation of Concern (分离关注) 
– SoC 侧重战术 
– 典型案例:S.O.L.I.D.、n-Layer、TDD、DDD、MDA、DSL、etc. 
? 业务复杂vs. 技术复杂 
– 业务复杂应对策略:OO、DDD、四色原型、etc. 
– 技术复杂应对策略:n-Layer、n-Tier、Distributed、etc. 
– 业务+ 技术复杂应对策略:DSL
携程架构设计“S”之Case Study 
? S ? Simple & Suitable & Scalable 
? 以CMessaging 为例,它主要解决哪个S? 
? 请排序:Simple, Suitable (balance), Scalable (10x)?
引子:面向对象开发三大名言 
? 抽象不变,封装变化 
– XXX Pattern 
– YYY Framework 
? 面向接口编程 
– 低耦合 
– S.O.L.I.D. 中有3 条与接口紧密相关 
? 优先使用组合 
– 高内聚 
– Biz App 慎用继承,why?
Case Study:Factory + new() ?
Case Study:低耦合?
另一低耦合案例:BLL 访问Session? 
SoC-style 做法:在Controller 中 
访问封装过的Session Utility
Ctrip 2013 RCA 特点:Non-Functional Bugs
开发人员的困惑:多快好省? 
? 多? 最近项目有点多,怎么都是最高优先级? 
? 快? 业务要求快点上,项目经理都是催命三郎 
? 好? 老板要求质量高,架构师说不能违背设计 
? 省? 加班加点人手少,copy-paste 代码最省心 
? 结论:多快好省催人老,开发效率难提高?
10x 基础:Design + LPT + 开发效率?x 
开发人员术业有专攻? 
开发效率大幅度提升? 
减少技术犯错的概率? 
有时间关注性能问题? 
有可能实现10x scalability 目标!
开发效率:如何实现【术业有专攻】?
Why n-Layer ? Why MVC ? 
? 分离关注,分离依赖(SoC) 
– 因为分离,所以可扩展(Open-Close 原则) 
– 因为分离,所以可单独测试 
? 传统n-Layer 或Web Forms 架构 
– 分离部分关注,分离部分依赖 
– UI/View 分离仍然难以解决 
? MVC 架构 
– 尽可能分离一切关注,尽可能分离一切依赖 
– UI/View 是最难分离的-> Controller
传统3-Layer & 3-Tier 的问题?
传统3-Layer & 3-Tier 的问题(笔别迟厂丑辞辫)?
传统3-Layer & 3-Tier 的问题(笔别迟厂迟辞谤别)?
问:传统n-Layer 两大问题?
答:传统n-Layer 两大问题? 
#1:高耦合? 跨层调用依赖实现 
#2:低内聚? 业务逻辑各自为政
n-Layer 反面案例,评估需谨慎 
? Northwind 
– Model 诲人,SP 毁人 
? Duwamish 
– Layer 诲人,SP、DataSet 毁人 
? PetShop 
– Factory、POCO 诲人,【伪分层】毁人? 毁人之王! 
? Microsoft Domain-Oriented N-Layered App 
– 典型Overdesign ?【简单问题复杂化】之“楷模”!
MVC 的因果循环? 让你爱上测试! 
? 为什么要MVC? 
– 实现更全面的关注点分离(SoC),简单说是职责分离! 
? 为什么要(更全面的)关注点分离(或职责分离)? 
– 更容易单元测试、接口测试、压力测试、性能测试、etc. 
? 为什么要(更容易的)xxx/yyy/zzz 测试? 
– 体现更健壮的设计理念(TDD)! 
? 为什么要(更健壮的)设计理念? 
– 创造出更高质量的软件产物! 
? 为什么传统n-Layer 或Web Forms 创造不出高质量软 
件产物? 
– 不是创造不出,而是要付出很大代价(自动vs. 手工,简单vs. 复杂)! 
? 为什么MVC 可以创造出高质量软件产物(为什么要MVC)?
问:爱上单元测试两大障碍?
答:爱上单元测试两大障碍? 
#1:外部依赖(container, db, service, io, etc.) 
#2:体力运动(validation, comparison, etc.)
答:单元测试两大障碍解决方案! 
#1:外部依赖? Mock (dll + service) 
#2:体力运动? Case Generator
问:What is Mock ? Scenario ?
Mock Demo #1 – Interface Mock
Mock Demo #2 – Http Context
Mock Demo #3 – VS 2012 Fakes
问#1:Mock 难以对付的场景?
问#2:如何解决Mock 难以对 
付的场景?
Demo – 解决局部外部依赖问题 
#1:获取当前应用登录者 
#2:模拟Repository Layer
Demo – Unit Testing Case Generator 
Pex
Unit Testing 是提高软件质量的源头之一, 
SoC 同样如此,让我们看一个案例。。。
SoC Case Study:战国铸剑(穿越场景)?
Case Study:战国铸剑vs. 现代工业 
辰凌莞尔道:“这些东西不能让外人知道,任何一 
个诸侯国都不能泄露,这是咱们的优势,另外,我看白 
家铸剑坊内的工匠师,又有许多工匠助手、学徒,来帮 
助他共同完成一件兵器,比如说宝剑,剑身需要铸造、 
锤炼、打磨,剑柄需要挑选上好地拓木,然后套入剑柄 
外壳,用牛皮一层层紧紧地缠上去,然后制作剑鞘等等, 
一套流程下来,需要太多人在一起共同完成,而且每组 
至少有一个铸剑师、工匠师,对不对?”
Case Study:战国铸剑vs. 现代工业 
“是的呀,有什么不对的吗?”白若溪一双美眸紧 
紧盯着庆忌,不知道他从其中看出了什么弊病。 
辰凌轻笑着说:“因为这样一来,需要太多的工匠 
师和铸剑师了,雇佣金太高,资源浪费,一个学徒最终 
成为一个匠师,至少需要几年的时间,而且每个工匠师 
的手法不同,打造出来的兵器一批批都不相同,很难打 
造出品牌来。”
Case Study:战国铸剑vs. 现代工业 
“我在想,把这种师傅带徒弟的生产模式,改成流 
水线作业,也就是说,打铁的、铸剑的、做剑鞘的、打 
磨的、淬火的、还原的、装饰的一条工艺下来,各个工 
序分开,分成不同的工坊,流水线式生产。” 
“这样一来,学徒很快能上手,精熟自己工艺的活, 
而且统一传授,统一掌握,打造出来的工艺也差不多, 
以此类推,一柄剑铸造出来,由各个工坊配合,这样根 
本不需要太多的铸剑师、工匠师带队了!”
SoC Case Study:工程师标签? 
#1:技术标签vs. 业务标签 
#2:招聘岗位vs. 优先考虑 
#3:开发团队vs. 咨询顾问
回到Why n-Layer ? Why MVC ? 
#1:创业团队vs. 稳定团队 
#2:小微作坊vs. 研发中心 
#3:模块包干vs. 技能拆分
n-Layer 之特殊Layer:Cross-Cutting 
? Security 
– Authentication, SSO, etc. 
– Authorization 
– Validation 
? Service 
– Logging 
– Caching 
? Others 
– IoC 
– Transaction 
– Monitoring, Alerting, SLA, etc.
Cross-Cutting 有点烦,有没有好方案? 
? Security 
– Authentication, SSO, etc. 
– Authorization ? Demo #1 
– Validation ? Demo #2 
? Service 
– Logging ? Demo #3 
– Caching 
? Others 
– IoC 
– Transaction 
– Monitoring, Alerting, SLA, etc.
问#3:Cross-Cutting 演示中的 
共同点?
Cross-Cutting 演示与语言发展的共同点? 
? C# 1.0 
– Attribute (Java 5 Annotation) 
? C# 2.0 
– Generics (Java 5 Generics) 
? C# 3.0 
– Linq, Lambda (Java 8 Lambda) 
? C# 4.0 
– Parallel (Java 7 Fork/Join) 
– Dynamic, Functional Programming 
? C# 5.0 
– async/await
C# vNext?Cross-Cutting vNext?
问#4:Declarative vs. Imperative ? 
What vs. How ? 
不局限于Cross-Cutting ? 
Domain-Specific Language (DSL)
Domain、Data、Declarative、 
DDFx
Difference between Lib & Fx ? 
? 理解#1:框架与类库都可以认为是一种基础结构, 
而我们编写的代码是应用代码 
– 若是基础代码调用应用代码,则这种基础结构是框架, 
如:.NET CLR,ASP.NET MVC 
– 反之,若是应用代码调用基础代码,则这种基础结构是类库, 
如:.NET BCL,ASP.NET Web Controls 
? 理解#2:类库是类的集合,与类库相比,框架和类 
库有着相似的形式,即框架也往往是类的集合 
– 类库的类之间可能是相互独立的,应用开发者希望使用任何一 
个类时可直接调用它 
– 框架中的各个类不是孤立的,其业务逻辑将不同的类“连”在 
一起,在它们之间建立协作关系
Difference between Lib & Fx ? 
? 总结#1:框架通过封装处理流程的控制逻辑,使它对 
开发者透明,来简化开发工作! 
– 类库由现成的、供开发者用于构建应用的组件组成,但是,开发 
者必须理解不同组件之间的关系,并编写处理流程代码把众多组 
件组织起来 
– 框架则不同,它通过预先把众多组件组织在一起的方式,封装了 
处理流程的控制逻辑;因此,开发者就不用再编写控制逻辑来组 
织组件之间的交互了 
? 总结#2:Library 解决一个或多个问题,侧重复用; 
Framework 解决一类问题,接近半成品,更关注架构 
? 总结#3:类库的基因是new,框架的基因的:
什么是Domain? 
作为软件方面的专家(架构师、开发人员)和领域专家 
(客户方业务人员、需求分析人员),所有人在一起创建 
领域的模型,这个模型会统一体现两个专业领域的交汇
什么是Data? 
Data Files、Database、Data Service、etc. 
SQL、NoSQL、AWS RDS、SQL Azure、etc.
What’s DDFx ? 
? DDFx 的第一个D 有两层含义:Data and Domain 
? DDFx 的第二个D == Driven,意为:…驱动的… 
? DDFx 的Fx == (Development / Design) Framework (and Tools) 
? DDFx 理解#1:Data-Driven (Development) Framework 
? DDFx 理解#2:Domain-Driven (Design) Framework 
? DDFx 具体内容尚在不断完善中,但请记住:DDFx 
不是万能的,所以,你要懂得:Context + Balance 
? DDFx 中某些非关键技术将采用Tech-Talk 方式进行
Domain-Driven Design Sample – 银行转账 
? 方案#1:acct_a.Transfer(amount, acct_b_no) 
– Using (TransactionScope ts = new TransactionScope()) 
– { 
this.Remove(amount); 
Account acct_b = new Account(acct_b_no); 
acct_b.Add(amount); 
ts.commit(); 
– } 
? 方案#2:acct_a.Transfer(amount, acct_b) 
– Using (TransactionScope ts = new TransactionScope()) 
– { 
this.Remove(amount); 
acct_b.Add(amount); 
ts.commit(); 
– }
Domain-Driven Design Sample – 银行转账 
? 方案#3:acct_svc.Transfer(acct_a_no, amount, acct_b_no) 
实现方: 
– Using (TransactionScope ts = new TransactionScope()) 
– { 
Account acct_a = new Account(acct_a_no); 
acct_a.Remove(amount); 
Account acct_b = new Account(acct_b_no); 
acct_b.Add(amount); 
ts.commit(); 
– } 
调用方: 
– acct_svc.Transfer(acct_a_no, amount, acct_b_no); 
? 推荐使用方案#3 ? Domain Models & Domain Objects
DDD 典型案例- 网上书店
面向对象三大名言之DDFx 注解 
? 抽象不变,封装变化? 尽可能使用Generics 
– XXX Pattern 
– YYY Framework 
? 面向接口编程? Cross-Layer 尽可能使用Factory 
– 低耦合 
– S.O.L.I.D. 中有3 条与接口紧密相关 
? 优先使用组合? Domain Model 组合Domain Object 
– 高内聚 
– Biz App 慎用继承,why?
HelloDDFx Demo #1:工厂与泛型 
IRepository<T> ? 
LinqRepository<T> ? RealRepository<T>
DDFx 中几个数字 
? 1 座工厂:DDFx Factory 
? 2 个车间:Domain Model (N 产物线) 
? Repository (N 产物线) 
? 3 种贯穿:DTO ? Domain Model Intf. ? Repository Intf. 
? 6 层架构:Presentation ?? Application/Controller ?? 
Service ?? Domain ?? Repository ?? Resource 
? 10 大前端: 
– C/S:Console ? Windows Forms ? WPF 
– B/S:ASP.NET Web Forms ? Ajax ? MVC / MVVM (ViewModel : DTO) 
– RIA:Silverlight (.NET 子集) 
– Device:Windows Phone 7 (Silverlight 子集) ? iPhone/Android (Xamarin)
图表样例- 1:Visual Studio 生成
图表样例- 2:Visual Studio 生成
DDFx 架构层次 
? 整体架构:6 层架构+ 1 座工厂(DDFx Factory) 
? Layer #1:用户表现层(Presentation Layer) 
? Layer #2:应用系统层(Application Layer) 
? Layer #3:服务表现层(Service Layer, 可选) 
? Layer #4:领域模型层(Domain Layer) 
? Layer #5:资源访问层(Repository Layer) 
? Layer #6:资源层(关系数据库、外部服务、文件系统、etc.)
HelloDDFx Demo #2 
Webforms/MVC/Ajax
DDFx 中几个理念和约定(1) 
? Domain Design 分两个阶段 
– Domain Model Design ? 低耦合? Boundary & Interface 
– Domain Object Design ? 高内聚? Relationship & Logic 
? Domain Service Interface : Domain Model Interface 
– local call or remote call ? 对调用方透明 
? local call ? interface ? local dll 
? remote call ? interface ? svc ? local call ? interface ? local dll 
? Data Objects 有三种 
– DTO == Data Transfer Object,贯穿所有Layers 
– DO == Domain Object,默认采用充血模型 
– VM == View Model,映射至DTO & DO
DDFx 中几个理念和约定(2) 
? 设计次序 
– 1、Layer ? Domain Model (Interface/Fa?ade/etc.) 
– 2、Domain Object (Granularity) 
– 3、Data (RDBMS/NoSQL/Cache/File/Svc/etc.) 
? 开发次序 
– 1、Domain Object / Data 可以根据需要Mock 
– 2、UI / Domain Object / Data 可以并行开发 
? 测试次序 
– 1、Domain Object / Data 可以根据需要Mock 
– 2、UI / Domain Object / Data 可以并行测试 
– 3、集成测试
Interface Case Study 
? 机票捆绑卖保险 
– 方案#1:只提供机票方法 
– 方案#2:既提供机票方法,也提供保险方法 
? 酒店关键字搜索 
– 方案#1:在现有查询方法上提供关键字查询功能 
– 方案#2:新增一个关键字查询方法,内部完成调度 
– 方案#3:由调用方分别调用关键字搜索、酒店查询方法 
? 简单总结: 
Interface Design 
???ò????
Granularity Case Study 
? 为何“Account、Cart”不合并到一个Domain Object? 
– 理由#1? 
– 理由#2? 
? 为何“Discount”不合并到其它Domain Object? 
– 理由#1?理由#2?理由#3? 
– 理由#4? 
? 为何“Item”聚合“Book”而不是反过来? 
– 理由#1? 
– 理由#2? 
? Order Type 设计为Enum 还是Domain Object?
Ctrip DDD Real Projects 
? 度假供应商管理– 周啸洪、李少鹏 
? 公共服务积分商城– 李小林、顾新春 
? More complex business projects ? 
? All complex business projects ?
HelloDDFx Demo #3 
WP/Android
HelloDDFx Demo #4 
Declarative-Driven Development
Declarative to DSL ? 任重而道远! 
? Declarative Samples 
– Attribute 
– Linq + Lambda 
– Fluent Interface (jQuery) + Functional Programming (F#) 
? DSL Samples 
– SQL, XSLT, CSS, ABAP, MATLAB, etc. 
– LINQ to SQL Designer, Entity Framework Designer, etc. 
– Class Designer, Workflow Designer, etc. 
– VS UML Diagram Designer 
– CodeSmith, T4, etc. 
– XXX Model Designer, YYY Domain Language, etc.
对于应用软件开发的大胆推测(not YY) 
? 应用开发4 个演进阶段 
– Data-Driven 
– Domain-Driven 
– Declarative-Driven 
– DSL-Driven + Factory-Composing 
? 高效开发4 个努力方向 
– Single DSL ? Microsoft Axum (Demo #1), Microsoft Oslo, etc. 
– Simple RAD ? Dynamic Data (Demo #2), LightSwtich (Demo #3), etc. 
– DSL + RAD ? Microsoft Business Framework, Sculpture, etc. 
– Software Factory
回到10x 基础:Design + LPT + 开发效率?x 
开发人员术业有专攻? 
开发效率大幅度提升? 
减少技术犯错的概率? 
有时间关注性能问题? 
有可能实现10x scalability 目标!
回到开发效率:如何实现【术业有专攻】? 
n-Layer Design ? 
n-Layer Development ? 
n-Layer Developer Role Model? 
UI Dev + Biz Dev + Data Dev + etc. ? 
Interface-Oriented Design/Dev/Testing!
现状:熟悉某几个模块vs. 精通所有技术 
建议:熟悉全组业务vs. 精通某几门技术
n-Layer Dev Role Model 建议 
? Presentation Layer + Application Layer 
– MVC:View, Controller, ViewModel 
– 具体技术:HTML, JS, HTTP, ASP.NET, etc. 
– Service Consumer 技术:API/Svc/Queue/WCF, etc. 
? Domain Layer 
– MVC:Model, Domain Objects 
– 具体技术:OO & DDD, Data Structure & Algorithm, etc. 
– Service Provider 技术:API/Svc/Queue/WCF, etc. 
? Infrastructure Layer 
– 具体技术:SQL/Replication/SSIS/Job, DAL, IO, etc. 
– Service Consumer 技术:API/Svc/Queue/WCF, etc. 
? Cross-Cutting (Fx Team, Arch Team, etc.) 
? Security, Logging, Caching, Monitoring, Alerting, Utility, etc.
探讨#1:需求变更导致新增 
字段,你会怎么做?
探讨#2:你身边有哪些软件, 
始终坚持着“简单”?
广告#1:Component Identification 
via DDD (王概凯, Kevin)
广告#2:Domain-Specific Language 
(张雪峰, William)
广告#3:领域特定语言(Martin Fowler)
Q & A

More Related Content

What's hot (20)

PDF
導讀持續交付 2.0 - 談當代軟體交付之虛實融合
Rick Hwang
?
DOCX
Resume_CNandEN
Jack Gao
?
PPTX
領域驅動設計 (Domain Driven Design)
Jeff Chu
?
PDF
Top100summit前端的云时代支付宝前端平台架构 王保平
drewz lin
?
PPTX
Oracle saa s paas overview
Chris Lee
?
PDF
敏捷开发技术最佳实践(统一敏捷开发过程)
Weijun Zhong
?
PDF
新浪微博大规模基于Docker的混合云应用实践 -王关胜
Weibo Corporation
?
PPT
一淘新首页总结
jieorlin
?
PPTX
聊天機器人概論 Introduce to chat bot sevices
Duran Hsieh
?
PDF
我的互联网运维理论与实践
Leo Zhou
?
PDF
前端工程化与工具链实践
ucarticle
?
PPTX
哥寫的不是程式,是軟體 - 從嵌入式系統看軟體工程全貌
Tun-Yu Chang
?
PDF
91APP: 從 "零" 開始的 DevOps
Andrew Wu
?
PDF
项目管理敏捷方法
Weijun Zhong
?
PDF
阿里巴巴运维团队的无状态运维思路
mysqlops
?
PPTX
20140326联动优势数据访问层顿础尝架构和实践7(刘胜)工行交流
liu sheng
?
PPTX
2021 ee大会-旷视ai产物背后的研发效能工具建设
Tianwei Liu
?
PPTX
2020 11-27 Taiwan DDD Conference
Guan-Rong Huang
?
PPT
骋濒补蝉蝉贵颈蝉丑特性介绍
Jim Jiang
?
PDF
豆瓣Paa s平台 dae - 2017
Tianwei Liu
?
導讀持續交付 2.0 - 談當代軟體交付之虛實融合
Rick Hwang
?
Resume_CNandEN
Jack Gao
?
領域驅動設計 (Domain Driven Design)
Jeff Chu
?
Top100summit前端的云时代支付宝前端平台架构 王保平
drewz lin
?
Oracle saa s paas overview
Chris Lee
?
敏捷开发技术最佳实践(统一敏捷开发过程)
Weijun Zhong
?
新浪微博大规模基于Docker的混合云应用实践 -王关胜
Weibo Corporation
?
一淘新首页总结
jieorlin
?
聊天機器人概論 Introduce to chat bot sevices
Duran Hsieh
?
我的互联网运维理论与实践
Leo Zhou
?
前端工程化与工具链实践
ucarticle
?
哥寫的不是程式,是軟體 - 從嵌入式系統看軟體工程全貌
Tun-Yu Chang
?
91APP: 從 "零" 開始的 DevOps
Andrew Wu
?
项目管理敏捷方法
Weijun Zhong
?
阿里巴巴运维团队的无状态运维思路
mysqlops
?
20140326联动优势数据访问层顿础尝架构和实践7(刘胜)工行交流
liu sheng
?
2021 ee大会-旷视ai产物背后的研发效能工具建设
Tianwei Liu
?
2020 11-27 Taiwan DDD Conference
Guan-Rong Huang
?
骋濒补蝉蝉贵颈蝉丑特性介绍
Jim Jiang
?
豆瓣Paa s平台 dae - 2017
Tianwei Liu
?

Viewers also liked (20)

PPTX
Full stack-development with node js
Xuefeng Zhang
?
PPTX
浅谈电商网站数据访问层(DAL)与 ORM 之适用性
Xuefeng Zhang
?
PDF
Ab Testing
newegg
?
PDF
Applying UML and Patterns (CH1, 6, 9, 10)
Jamie (Taka) Wang
?
PPT
Metric and Dashboard
Chen Huang
?
PDF
当你的用户是来赚钱的时候:互连网金融投资需求与设计
Leon Zeng
?
PDF
F2e @ douban
Kejun Zhang
?
PDF
面向未来的重构
Kejun Zhang
?
PDF
一拍一产物背后的故事(搁别补肠迟实战)
Kejun Zhang
?
KEY
高粒度模块化的前端开发
iddcn
?
PDF
Ued交流会 《用户体验杂谈》
iddcn
?
PPTX
如何將現有 Web form 轉換到mvc
Gelis Wu
?
PDF
搜索引擎与网站间网络结构:基于能见指数的分析 Wuhan liao and zhang 海峡两岸
Hanteng Liao
?
PDF
Let's talk about Web Design
Abby Chiu
?
PDF
SOHU_Entrprise_Email_System_Design-200312
SITONG SHEN
?
PDF
Facebook Dynamic Product Adverts
Chen Liwei
?
PDF
Facebook 競價
Chen Liwei
?
PPTX
Vpon - 廣告效果導向為基礎的行動廣告系統
Vpon
?
PDF
Web 前端工程师与成长
RANK LIU
?
PDF
从学生到工程师
RANK LIU
?
Full stack-development with node js
Xuefeng Zhang
?
浅谈电商网站数据访问层(DAL)与 ORM 之适用性
Xuefeng Zhang
?
Ab Testing
newegg
?
Applying UML and Patterns (CH1, 6, 9, 10)
Jamie (Taka) Wang
?
Metric and Dashboard
Chen Huang
?
当你的用户是来赚钱的时候:互连网金融投资需求与设计
Leon Zeng
?
F2e @ douban
Kejun Zhang
?
面向未来的重构
Kejun Zhang
?
一拍一产物背后的故事(搁别补肠迟实战)
Kejun Zhang
?
高粒度模块化的前端开发
iddcn
?
Ued交流会 《用户体验杂谈》
iddcn
?
如何將現有 Web form 轉換到mvc
Gelis Wu
?
搜索引擎与网站间网络结构:基于能见指数的分析 Wuhan liao and zhang 海峡两岸
Hanteng Liao
?
Let's talk about Web Design
Abby Chiu
?
SOHU_Entrprise_Email_System_Design-200312
SITONG SHEN
?
Facebook Dynamic Product Adverts
Chen Liwei
?
Facebook 競價
Chen Liwei
?
Vpon - 廣告效果導向為基礎的行動廣告系統
Vpon
?
Web 前端工程师与成长
RANK LIU
?
从学生到工程师
RANK LIU
?
Ad

Similar to N-layer design & development (20)

PPTX
An introduce to n hibernate (part 1) pub
jiangxu
?
PDF
领域驱动设计实践
Jacky Chi
?
PPTX
面向模式的软件体系架构
Weijun Zhong
?
PPT
软件工程
bill0077
?
PPT
软件工程 第九章
浒 刘
?
PPT
Se2009 ch9
浒 刘
?
PPT
软件工程 第十一章
浒 刘
?
PDF
软件设计原则、模式与应用
yiditushe
?
DOC
闯补惫补相关基础知识
yiditushe
?
PDF
Real World ASP.NET MVC
jeffz
?
PDF
翱辞诲启思录01
yiditushe
?
PPT
鲍尘濒面向对象的分析与设计
xunhao
?
PDF
从知乎 iPhone 端重构说开去:Web 为主的复杂社交产物的 iOS 端开发策略及实践
imShining @DevCamp
?
PDF
础箩补虫设计技术
yiditushe
?
DOC
闯补惫补面试笔试题大汇总
yiditushe
?
PDF
Python 数据库技术第三讲
March Liu
?
PPTX
领域驱动设计与模型驱动开发
Weijun Zhong
?
PDF
NHibernate分享(1) share
Xu Huang
?
PPS
第1章 系统分析与设计技术 第1部分 1.3认知对象及其建模视角
yushilin
?
PPTX
Web development introduced history and future
jarryli
?
An introduce to n hibernate (part 1) pub
jiangxu
?
领域驱动设计实践
Jacky Chi
?
面向模式的软件体系架构
Weijun Zhong
?
软件工程
bill0077
?
软件工程 第九章
浒 刘
?
Se2009 ch9
浒 刘
?
软件工程 第十一章
浒 刘
?
软件设计原则、模式与应用
yiditushe
?
闯补惫补相关基础知识
yiditushe
?
Real World ASP.NET MVC
jeffz
?
翱辞诲启思录01
yiditushe
?
鲍尘濒面向对象的分析与设计
xunhao
?
从知乎 iPhone 端重构说开去:Web 为主的复杂社交产物的 iOS 端开发策略及实践
imShining @DevCamp
?
础箩补虫设计技术
yiditushe
?
闯补惫补面试笔试题大汇总
yiditushe
?
Python 数据库技术第三讲
March Liu
?
领域驱动设计与模型驱动开发
Weijun Zhong
?
NHibernate分享(1) share
Xu Huang
?
第1章 系统分析与设计技术 第1部分 1.3认知对象及其建模视角
yushilin
?
Web development introduced history and future
jarryli
?
Ad

N-layer design & development

  • 1. n-Layer Design & Development
  • 2. Agenda ? 引子、Why n-Layer、Why MVC ? Domain、Data、DDFx ? HelloDDFx Demo ? Q & A
  • 3. 引子:以下哪些对于经典三层架构的描述是正确的? ? 1、User Interface(UI)层一般指Web 前端,主要负责用户交互 ? 2、Business Logic(BL)层一般指业务逻辑,可以包括UI 逻辑 ? 3、Business Logic(BL)层一般指业务逻辑,不可以包括UI 逻辑 ? 4、Data Access(DA)层一般指数据访问,主要负责关系数据库 交互 ? 5、三层架构的优势是把代码分散到不同模块中,以方便程序员 编写不同的部分,实现代码重用
  • 4. 引子:以下哪些对于经典三层架构的描述是正确的? ? 1、User Interface(UI)层一般指Web 前端,主要负责用户交互 ? 2、Business Logic(BL)层一般指业务逻辑,可以包括UI 逻辑 ? 3、Business Logic(BL)层一般指业务逻辑,不可以包括UI 逻辑 ? 4、Data Access(DA)层一般指数据访问,主要负责关系数据库 交互 ? 5、三层架构的优势是把代码分散到不同模块中,以方便程序员 编写不同的部分,实现代码重用
  • 5. 引子:对于简单& 复杂的3 条语录 ? 代码像首诗 – Code is like a poem ? 设计是一场与复杂性的战斗 – We believe designing systems is a fight against complexity. – Most of the time the best way to fight complexity is by not creating it. ? Coding 是件“艰苦”的事,唯一的办 法是享受它;如果Coding 已不能带来 快乐,就考虑“停止”它。
  • 6. 引子:应对复杂问题两大策略 ? Divide and Conquer (分而治之) – D&C 侧重战略 – 典型案例:递归、Quick-Sort、Map-Reduce、etc. ? Separation of Concern (分离关注) – SoC 侧重战术 – 典型案例:S.O.L.I.D.、n-Layer、TDD、DDD、MDA、DSL、etc. ? 业务复杂vs. 技术复杂 – 业务复杂应对策略:OO、DDD、四色原型、etc. – 技术复杂应对策略:n-Layer、n-Tier、Distributed、etc. – 业务+ 技术复杂应对策略:DSL
  • 7. 携程架构设计“S”之Case Study ? S ? Simple & Suitable & Scalable ? 以CMessaging 为例,它主要解决哪个S? ? 请排序:Simple, Suitable (balance), Scalable (10x)?
  • 8. 引子:面向对象开发三大名言 ? 抽象不变,封装变化 – XXX Pattern – YYY Framework ? 面向接口编程 – 低耦合 – S.O.L.I.D. 中有3 条与接口紧密相关 ? 优先使用组合 – 高内聚 – Biz App 慎用继承,why?
  • 11. 另一低耦合案例:BLL 访问Session? SoC-style 做法:在Controller 中 访问封装过的Session Utility
  • 12. Ctrip 2013 RCA 特点:Non-Functional Bugs
  • 13. 开发人员的困惑:多快好省? ? 多? 最近项目有点多,怎么都是最高优先级? ? 快? 业务要求快点上,项目经理都是催命三郎 ? 好? 老板要求质量高,架构师说不能违背设计 ? 省? 加班加点人手少,copy-paste 代码最省心 ? 结论:多快好省催人老,开发效率难提高?
  • 14. 10x 基础:Design + LPT + 开发效率?x 开发人员术业有专攻? 开发效率大幅度提升? 减少技术犯错的概率? 有时间关注性能问题? 有可能实现10x scalability 目标!
  • 16. Why n-Layer ? Why MVC ? ? 分离关注,分离依赖(SoC) – 因为分离,所以可扩展(Open-Close 原则) – 因为分离,所以可单独测试 ? 传统n-Layer 或Web Forms 架构 – 分离部分关注,分离部分依赖 – UI/View 分离仍然难以解决 ? MVC 架构 – 尽可能分离一切关注,尽可能分离一切依赖 – UI/View 是最难分离的-> Controller
  • 17. 传统3-Layer & 3-Tier 的问题?
  • 18. 传统3-Layer & 3-Tier 的问题(笔别迟厂丑辞辫)?
  • 19. 传统3-Layer & 3-Tier 的问题(笔别迟厂迟辞谤别)?
  • 21. 答:传统n-Layer 两大问题? #1:高耦合? 跨层调用依赖实现 #2:低内聚? 业务逻辑各自为政
  • 22. n-Layer 反面案例,评估需谨慎 ? Northwind – Model 诲人,SP 毁人 ? Duwamish – Layer 诲人,SP、DataSet 毁人 ? PetShop – Factory、POCO 诲人,【伪分层】毁人? 毁人之王! ? Microsoft Domain-Oriented N-Layered App – 典型Overdesign ?【简单问题复杂化】之“楷模”!
  • 23. MVC 的因果循环? 让你爱上测试! ? 为什么要MVC? – 实现更全面的关注点分离(SoC),简单说是职责分离! ? 为什么要(更全面的)关注点分离(或职责分离)? – 更容易单元测试、接口测试、压力测试、性能测试、etc. ? 为什么要(更容易的)xxx/yyy/zzz 测试? – 体现更健壮的设计理念(TDD)! ? 为什么要(更健壮的)设计理念? – 创造出更高质量的软件产物! ? 为什么传统n-Layer 或Web Forms 创造不出高质量软 件产物? – 不是创造不出,而是要付出很大代价(自动vs. 手工,简单vs. 复杂)! ? 为什么MVC 可以创造出高质量软件产物(为什么要MVC)?
  • 25. 答:爱上单元测试两大障碍? #1:外部依赖(container, db, service, io, etc.) #2:体力运动(validation, comparison, etc.)
  • 26. 答:单元测试两大障碍解决方案! #1:外部依赖? Mock (dll + service) #2:体力运动? Case Generator
  • 27. 问:What is Mock ? Scenario ?
  • 28. Mock Demo #1 – Interface Mock
  • 29. Mock Demo #2 – Http Context
  • 30. Mock Demo #3 – VS 2012 Fakes
  • 33. Demo – 解决局部外部依赖问题 #1:获取当前应用登录者 #2:模拟Repository Layer
  • 34. Demo – Unit Testing Case Generator Pex
  • 35. Unit Testing 是提高软件质量的源头之一, SoC 同样如此,让我们看一个案例。。。
  • 37. Case Study:战国铸剑vs. 现代工业 辰凌莞尔道:“这些东西不能让外人知道,任何一 个诸侯国都不能泄露,这是咱们的优势,另外,我看白 家铸剑坊内的工匠师,又有许多工匠助手、学徒,来帮 助他共同完成一件兵器,比如说宝剑,剑身需要铸造、 锤炼、打磨,剑柄需要挑选上好地拓木,然后套入剑柄 外壳,用牛皮一层层紧紧地缠上去,然后制作剑鞘等等, 一套流程下来,需要太多人在一起共同完成,而且每组 至少有一个铸剑师、工匠师,对不对?”
  • 38. Case Study:战国铸剑vs. 现代工业 “是的呀,有什么不对的吗?”白若溪一双美眸紧 紧盯着庆忌,不知道他从其中看出了什么弊病。 辰凌轻笑着说:“因为这样一来,需要太多的工匠 师和铸剑师了,雇佣金太高,资源浪费,一个学徒最终 成为一个匠师,至少需要几年的时间,而且每个工匠师 的手法不同,打造出来的兵器一批批都不相同,很难打 造出品牌来。”
  • 39. Case Study:战国铸剑vs. 现代工业 “我在想,把这种师傅带徒弟的生产模式,改成流 水线作业,也就是说,打铁的、铸剑的、做剑鞘的、打 磨的、淬火的、还原的、装饰的一条工艺下来,各个工 序分开,分成不同的工坊,流水线式生产。” “这样一来,学徒很快能上手,精熟自己工艺的活, 而且统一传授,统一掌握,打造出来的工艺也差不多, 以此类推,一柄剑铸造出来,由各个工坊配合,这样根 本不需要太多的铸剑师、工匠师带队了!”
  • 40. SoC Case Study:工程师标签? #1:技术标签vs. 业务标签 #2:招聘岗位vs. 优先考虑 #3:开发团队vs. 咨询顾问
  • 41. 回到Why n-Layer ? Why MVC ? #1:创业团队vs. 稳定团队 #2:小微作坊vs. 研发中心 #3:模块包干vs. 技能拆分
  • 42. n-Layer 之特殊Layer:Cross-Cutting ? Security – Authentication, SSO, etc. – Authorization – Validation ? Service – Logging – Caching ? Others – IoC – Transaction – Monitoring, Alerting, SLA, etc.
  • 43. Cross-Cutting 有点烦,有没有好方案? ? Security – Authentication, SSO, etc. – Authorization ? Demo #1 – Validation ? Demo #2 ? Service – Logging ? Demo #3 – Caching ? Others – IoC – Transaction – Monitoring, Alerting, SLA, etc.
  • 45. Cross-Cutting 演示与语言发展的共同点? ? C# 1.0 – Attribute (Java 5 Annotation) ? C# 2.0 – Generics (Java 5 Generics) ? C# 3.0 – Linq, Lambda (Java 8 Lambda) ? C# 4.0 – Parallel (Java 7 Fork/Join) – Dynamic, Functional Programming ? C# 5.0 – async/await
  • 47. 问#4:Declarative vs. Imperative ? What vs. How ? 不局限于Cross-Cutting ? Domain-Specific Language (DSL)
  • 49. Difference between Lib & Fx ? ? 理解#1:框架与类库都可以认为是一种基础结构, 而我们编写的代码是应用代码 – 若是基础代码调用应用代码,则这种基础结构是框架, 如:.NET CLR,ASP.NET MVC – 反之,若是应用代码调用基础代码,则这种基础结构是类库, 如:.NET BCL,ASP.NET Web Controls ? 理解#2:类库是类的集合,与类库相比,框架和类 库有着相似的形式,即框架也往往是类的集合 – 类库的类之间可能是相互独立的,应用开发者希望使用任何一 个类时可直接调用它 – 框架中的各个类不是孤立的,其业务逻辑将不同的类“连”在 一起,在它们之间建立协作关系
  • 50. Difference between Lib & Fx ? ? 总结#1:框架通过封装处理流程的控制逻辑,使它对 开发者透明,来简化开发工作! – 类库由现成的、供开发者用于构建应用的组件组成,但是,开发 者必须理解不同组件之间的关系,并编写处理流程代码把众多组 件组织起来 – 框架则不同,它通过预先把众多组件组织在一起的方式,封装了 处理流程的控制逻辑;因此,开发者就不用再编写控制逻辑来组 织组件之间的交互了 ? 总结#2:Library 解决一个或多个问题,侧重复用; Framework 解决一类问题,接近半成品,更关注架构 ? 总结#3:类库的基因是new,框架的基因的:
  • 52. 什么是Data? Data Files、Database、Data Service、etc. SQL、NoSQL、AWS RDS、SQL Azure、etc.
  • 53. What’s DDFx ? ? DDFx 的第一个D 有两层含义:Data and Domain ? DDFx 的第二个D == Driven,意为:…驱动的… ? DDFx 的Fx == (Development / Design) Framework (and Tools) ? DDFx 理解#1:Data-Driven (Development) Framework ? DDFx 理解#2:Domain-Driven (Design) Framework ? DDFx 具体内容尚在不断完善中,但请记住:DDFx 不是万能的,所以,你要懂得:Context + Balance ? DDFx 中某些非关键技术将采用Tech-Talk 方式进行
  • 54. Domain-Driven Design Sample – 银行转账 ? 方案#1:acct_a.Transfer(amount, acct_b_no) – Using (TransactionScope ts = new TransactionScope()) – { this.Remove(amount); Account acct_b = new Account(acct_b_no); acct_b.Add(amount); ts.commit(); – } ? 方案#2:acct_a.Transfer(amount, acct_b) – Using (TransactionScope ts = new TransactionScope()) – { this.Remove(amount); acct_b.Add(amount); ts.commit(); – }
  • 55. Domain-Driven Design Sample – 银行转账 ? 方案#3:acct_svc.Transfer(acct_a_no, amount, acct_b_no) 实现方: – Using (TransactionScope ts = new TransactionScope()) – { Account acct_a = new Account(acct_a_no); acct_a.Remove(amount); Account acct_b = new Account(acct_b_no); acct_b.Add(amount); ts.commit(); – } 调用方: – acct_svc.Transfer(acct_a_no, amount, acct_b_no); ? 推荐使用方案#3 ? Domain Models & Domain Objects
  • 57. 面向对象三大名言之DDFx 注解 ? 抽象不变,封装变化? 尽可能使用Generics – XXX Pattern – YYY Framework ? 面向接口编程? Cross-Layer 尽可能使用Factory – 低耦合 – S.O.L.I.D. 中有3 条与接口紧密相关 ? 优先使用组合? Domain Model 组合Domain Object – 高内聚 – Biz App 慎用继承,why?
  • 58. HelloDDFx Demo #1:工厂与泛型 IRepository<T> ? LinqRepository<T> ? RealRepository<T>
  • 59. DDFx 中几个数字 ? 1 座工厂:DDFx Factory ? 2 个车间:Domain Model (N 产物线) ? Repository (N 产物线) ? 3 种贯穿:DTO ? Domain Model Intf. ? Repository Intf. ? 6 层架构:Presentation ?? Application/Controller ?? Service ?? Domain ?? Repository ?? Resource ? 10 大前端: – C/S:Console ? Windows Forms ? WPF – B/S:ASP.NET Web Forms ? Ajax ? MVC / MVVM (ViewModel : DTO) – RIA:Silverlight (.NET 子集) – Device:Windows Phone 7 (Silverlight 子集) ? iPhone/Android (Xamarin)
  • 62. DDFx 架构层次 ? 整体架构:6 层架构+ 1 座工厂(DDFx Factory) ? Layer #1:用户表现层(Presentation Layer) ? Layer #2:应用系统层(Application Layer) ? Layer #3:服务表现层(Service Layer, 可选) ? Layer #4:领域模型层(Domain Layer) ? Layer #5:资源访问层(Repository Layer) ? Layer #6:资源层(关系数据库、外部服务、文件系统、etc.)
  • 63. HelloDDFx Demo #2 Webforms/MVC/Ajax
  • 64. DDFx 中几个理念和约定(1) ? Domain Design 分两个阶段 – Domain Model Design ? 低耦合? Boundary & Interface – Domain Object Design ? 高内聚? Relationship & Logic ? Domain Service Interface : Domain Model Interface – local call or remote call ? 对调用方透明 ? local call ? interface ? local dll ? remote call ? interface ? svc ? local call ? interface ? local dll ? Data Objects 有三种 – DTO == Data Transfer Object,贯穿所有Layers – DO == Domain Object,默认采用充血模型 – VM == View Model,映射至DTO & DO
  • 65. DDFx 中几个理念和约定(2) ? 设计次序 – 1、Layer ? Domain Model (Interface/Fa?ade/etc.) – 2、Domain Object (Granularity) – 3、Data (RDBMS/NoSQL/Cache/File/Svc/etc.) ? 开发次序 – 1、Domain Object / Data 可以根据需要Mock – 2、UI / Domain Object / Data 可以并行开发 ? 测试次序 – 1、Domain Object / Data 可以根据需要Mock – 2、UI / Domain Object / Data 可以并行测试 – 3、集成测试
  • 66. Interface Case Study ? 机票捆绑卖保险 – 方案#1:只提供机票方法 – 方案#2:既提供机票方法,也提供保险方法 ? 酒店关键字搜索 – 方案#1:在现有查询方法上提供关键字查询功能 – 方案#2:新增一个关键字查询方法,内部完成调度 – 方案#3:由调用方分别调用关键字搜索、酒店查询方法 ? 简单总结: Interface Design ???ò????
  • 67. Granularity Case Study ? 为何“Account、Cart”不合并到一个Domain Object? – 理由#1? – 理由#2? ? 为何“Discount”不合并到其它Domain Object? – 理由#1?理由#2?理由#3? – 理由#4? ? 为何“Item”聚合“Book”而不是反过来? – 理由#1? – 理由#2? ? Order Type 设计为Enum 还是Domain Object?
  • 68. Ctrip DDD Real Projects ? 度假供应商管理– 周啸洪、李少鹏 ? 公共服务积分商城– 李小林、顾新春 ? More complex business projects ? ? All complex business projects ?
  • 69. HelloDDFx Demo #3 WP/Android
  • 70. HelloDDFx Demo #4 Declarative-Driven Development
  • 71. Declarative to DSL ? 任重而道远! ? Declarative Samples – Attribute – Linq + Lambda – Fluent Interface (jQuery) + Functional Programming (F#) ? DSL Samples – SQL, XSLT, CSS, ABAP, MATLAB, etc. – LINQ to SQL Designer, Entity Framework Designer, etc. – Class Designer, Workflow Designer, etc. – VS UML Diagram Designer – CodeSmith, T4, etc. – XXX Model Designer, YYY Domain Language, etc.
  • 72. 对于应用软件开发的大胆推测(not YY) ? 应用开发4 个演进阶段 – Data-Driven – Domain-Driven – Declarative-Driven – DSL-Driven + Factory-Composing ? 高效开发4 个努力方向 – Single DSL ? Microsoft Axum (Demo #1), Microsoft Oslo, etc. – Simple RAD ? Dynamic Data (Demo #2), LightSwtich (Demo #3), etc. – DSL + RAD ? Microsoft Business Framework, Sculpture, etc. – Software Factory
  • 73. 回到10x 基础:Design + LPT + 开发效率?x 开发人员术业有专攻? 开发效率大幅度提升? 减少技术犯错的概率? 有时间关注性能问题? 有可能实现10x scalability 目标!
  • 74. 回到开发效率:如何实现【术业有专攻】? n-Layer Design ? n-Layer Development ? n-Layer Developer Role Model? UI Dev + Biz Dev + Data Dev + etc. ? Interface-Oriented Design/Dev/Testing!
  • 76. n-Layer Dev Role Model 建议 ? Presentation Layer + Application Layer – MVC:View, Controller, ViewModel – 具体技术:HTML, JS, HTTP, ASP.NET, etc. – Service Consumer 技术:API/Svc/Queue/WCF, etc. ? Domain Layer – MVC:Model, Domain Objects – 具体技术:OO & DDD, Data Structure & Algorithm, etc. – Service Provider 技术:API/Svc/Queue/WCF, etc. ? Infrastructure Layer – 具体技术:SQL/Replication/SSIS/Job, DAL, IO, etc. – Service Consumer 技术:API/Svc/Queue/WCF, etc. ? Cross-Cutting (Fx Team, Arch Team, etc.) ? Security, Logging, Caching, Monitoring, Alerting, Utility, etc.
  • 79. 广告#1:Component Identification via DDD (王概凯, Kevin)
  • 82. Q & A