Jdon Framework Domain-Driven Design(DDD)開源框架_第1頁
Jdon Framework Domain-Driven Design(DDD)開源框架_第2頁
Jdon Framework Domain-Driven Design(DDD)開源框架_第3頁
Jdon Framework Domain-Driven Design(DDD)開源框架_第4頁
Jdon Framework Domain-Driven Design(DDD)開源框架_第5頁
已閱讀5頁,還剩72頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、JdonFrameworkDomain-Driven Design(DDD)開源框架開源框架彭晨陽 ()實(shí)際需求 日常企業(yè)信息化過程中,經(jīng)常會(huì)一些表單數(shù)據(jù)需要輸入數(shù)據(jù)庫,如果可以在一兩個(gè)小時(shí)內(nèi)完成這樣的應(yīng)用是很多信息主管的想法。 中大型信息系統(tǒng)都是從當(dāng)時(shí)一兩個(gè)表單數(shù)據(jù)應(yīng)用基礎(chǔ)上建立起來。Simplify the Best 1. 能夠在一兩個(gè)小時(shí)內(nèi)快速開發(fā)簡單應(yīng)用系統(tǒng)。 2. 能夠在此架構(gòu)基礎(chǔ)上無縫平滑發(fā)展成為一個(gè)可方便維護(hù)、可靈活拓展、可伸縮的中大型系統(tǒng)。 JdonFramework(以下簡稱JF)就是這樣一個(gè)簡單易使的輕量框架。 JavaEE多層架構(gòu)MVC表現(xiàn)層持久層服務(wù)業(yè)務(wù)層領(lǐng)域模型CQR

2、S(命令查詢分離) ArchitectureUser interfaceServiceDomainEvent/Message BUSInfrastructureQuery/ReportingCommandsCommandsEventsJF在JEE架構(gòu)位置技術(shù)背景p由于多層結(jié)構(gòu)導(dǎo)致代碼復(fù)雜,系統(tǒng)編碼復(fù)雜,容易混亂,無法控制。p可選擇范圍太多導(dǎo)致學(xué)習(xí)成本比較高,無法使初學(xué)者快速上手。p目前J2EE標(biāo)準(zhǔn)技術(shù)只注重中大型系統(tǒng),小型單機(jī)系統(tǒng)市場被忽視,可伸縮的小中型系統(tǒng)不容易開發(fā)。 輕量框架新一代輕量框架 框架是現(xiàn)代Java開發(fā)的中心??蚣転橥酰?1. 靈活性,完全松耦合,實(shí)現(xiàn)多層解耦。 2. 快速性,

3、多層結(jié)構(gòu)代碼快速組裝。 3. 可伸縮性,小型系統(tǒng)架構(gòu)具備向中大型擴(kuò)張的可能性,一勞永逸解決小中型系統(tǒng)的各方面需求,如緩存/性能。JdonFramework特點(diǎn) DDD : 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì),通過突出領(lǐng)域模型作為整個(gè)系統(tǒng)的中心作用,以領(lǐng)域模型的設(shè)計(jì)驅(qū)動(dòng)表現(xiàn)層和數(shù)據(jù)庫的開發(fā)設(shè)計(jì)。 IOC或DI:完全自動(dòng)識(shí)別的依賴注射模式,可以完全擺脫類與類之間的依賴關(guān)系,大大提高開發(fā)效率和重構(gòu)速度。 Cache:內(nèi)置緩存自動(dòng)支持,借助Terracotta能夠無縫將應(yīng)用程序拓展到云計(jì)算架構(gòu)。DDD 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(Domain Driven Development )簡稱DDD 。 為什么要使用DDD/MDD? 有15種

4、理由。 DDD + DSL(領(lǐng)域語言或框架)是目前軟件主流趨勢。 JF是一種DSL性質(zhì)框架,未來會(huì)發(fā)展到真正DSL。Evans DDD大師說DDDDDD特點(diǎn) 統(tǒng)一語言:統(tǒng)一語言:一個(gè)無處不在(ubiquitous )的語言,項(xiàng)目中所有人統(tǒng)一交流的語言。減少溝通疑惑,減少傳達(dá)走樣。使得軟件更加適合需求。 統(tǒng)一領(lǐng)域模型統(tǒng)一領(lǐng)域模型:領(lǐng)域?qū)<液统绦騿T統(tǒng)一使用一種模型,沒有數(shù)據(jù)庫數(shù)據(jù)表等專業(yè)軟件技術(shù)干擾。 專門的業(yè)務(wù)領(lǐng)域?qū)訉iT的業(yè)務(wù)領(lǐng)域?qū)樱侯I(lǐng)域?qū)映藰I(yè)務(wù)沒有其他,沒有軟件架構(gòu) 框架等等底層技術(shù)。以模型為核心的衛(wèi)星圖Domain Model Domain ServiceLoggingGUIPersist

5、enceDDD優(yōu)點(diǎn)壞設(shè)計(jì)之一:失血模型 盡管使用MVC模式和框架,但是將大部分業(yè)務(wù)邏輯寫在控制器Controller中,如Struts的Action。甚至一個(gè)Action有幾千行。 盡管使用SOA的服務(wù),但是將大部分業(yè)務(wù)邏輯寫在服務(wù)中。 在上面兩種設(shè)計(jì)中,模型是只有setter/getter方法失血模型。模型對(duì)象成了純粹的數(shù)據(jù)包裝,沒有業(yè)務(wù)行為和方法。 失血模型導(dǎo)致軟件難于拓展和維護(hù),重新回到面向過程的編程老思路。隨著時(shí)間推移,開發(fā)效率降低。壞設(shè)計(jì)之二:基于數(shù)據(jù)表的設(shè)計(jì) 最初訂單有OrderItemId, OrderId, ProductId 和 Qty。 后來添加 MinDeliveryQt

6、y 和 PendingQty字段,這是和訂單交貨有關(guān)。 訂單和訂單交貨是兩個(gè)概念,但是我們把這些字段都混合在一個(gè)類中了。 盡管采取了OO設(shè)計(jì),但這還是一種帶有數(shù)據(jù)庫設(shè)計(jì)影子的壞設(shè)計(jì)。 DDD設(shè)計(jì):將實(shí)體的職責(zé)分離到不同限定場景 。領(lǐng)域設(shè)計(jì)和數(shù)據(jù)庫設(shè)計(jì)不同 領(lǐng)域不是把實(shí)體看成鐵板一塊,一開始就把它分解到各種場景。 下訂單和訂單交貨交付是兩個(gè)場景,它們應(yīng)該有彼此獨(dú)立的接口,由實(shí)體來實(shí)現(xiàn)。 在數(shù)據(jù)庫中它們是一個(gè),也就是說,從ER模型上看,它們是一個(gè)整體,但是從domain model領(lǐng)域模型角度看,它們是分離的。 領(lǐng)域設(shè)計(jì):以Domain Model核心 Domain Model是JF系統(tǒng)的第一個(gè)設(shè)

7、計(jì)開發(fā)對(duì)象。 每個(gè)Model都必須有一個(gè)主鍵;或唯一標(biāo)識(shí)。 由Domain Model延伸界面模型和持久實(shí)體。基于JF的DDD最佳實(shí)踐基于JF的DDD最佳實(shí)踐JF架構(gòu) Model 領(lǐng)域模型,包括實(shí)體模型 值對(duì)象和領(lǐng)域服務(wù),與技術(shù)架構(gòu)無關(guān)。相當(dāng)于魚;生存空間是緩沖器中 Service/Component 技術(shù)組件架構(gòu),用以支撐領(lǐng)域模型在計(jì)算機(jī)系統(tǒng)運(yùn)行的支撐環(huán)境,相當(dāng)于魚生活的水。空間在Context container,例如ServletContext中。 兩者以Domain Events模式交互:異步 命令。Model command Component Domain Model ModelD

8、omain ServiceServiceLoggingComponentGUIPersistenceComponentMessageMessageMessageMessageComponent architectureJF的架構(gòu)流程圖DDD實(shí)體模型 每個(gè)實(shí)體模型必須有一個(gè)唯一標(biāo)識(shí),如User對(duì)象必須有一個(gè)userId。 該實(shí)體模型必須以Model注解。以Model標(biāo)注的對(duì)象實(shí)例將存在緩存中,存在壽命以緩存設(shè)置ehcache為主。 服務(wù)模型必須以Service注解。服務(wù)實(shí)例化分單例、多例、池化Pool等三種方式。Domain Events 在Evans DDD實(shí)現(xiàn)過程中,經(jīng)常會(huì)碰到實(shí)體和服務(wù)Se

9、rvice以及Repository交互過程,這個(gè)交互過程的實(shí)現(xiàn)是一個(gè)難點(diǎn),也是容易造成失血貧血模型的主要途徑。 Domain Events提出解決方案, JF提供的異步觀察者模式為Domain Event實(shí)現(xiàn)提供更優(yōu)雅的解決方案。詳細(xì)文章見:http:/ interfaceServiceDomainEvent/Message BUSInfrastructureQuery/ReportingCommandsCommandsEvents保證純凈: No實(shí)體模型注射 領(lǐng)域模型中只有業(yè)務(wù),沒有計(jì)算機(jī)軟件架構(gòu)和技術(shù)。 不要將和技術(shù)相關(guān)的服務(wù)和功能組件注射到實(shí)體模型中,例如數(shù)據(jù)庫Dao等操作。 由領(lǐng)域模型

10、通過Domain Events機(jī)制指揮Domain 服務(wù)和其他功能組件,包括數(shù)據(jù)庫操作。http:/jonathan- Domain EventsDownload SourceDomain Events 工作原理Domain Model ModelListernerComponentJava concurrent FutureDomain MessagePool.run使用使用Java concurrent的的Future API 相關(guān)更詳細(xì)原理見“使用future實(shí)現(xiàn)內(nèi)置異步API” Domain Events 并發(fā)策略 異步消息 懶惰加載, 使用java 并行模型 類Actor Model

11、 Model 只能通過消息時(shí)間彼此聯(lián)系,這個(gè)消息是異步 非堵塞 屬于“fire-and-forget”。 DCI Architecture 在具體運(yùn)行場景時(shí),通過將業(yè)務(wù)邏輯方法注射到 Model標(biāo)注的領(lǐng)域模型對(duì)象中更多優(yōu)點(diǎn) 松耦合 業(yè)務(wù)邏輯能夠與技術(shù)架構(gòu)解耦,將”做什么”和”怎么做”分離 EDA架構(gòu)Event-driven Architecture 異步事件驅(qū)動(dòng)模式 異步懶惰加載Asynchronous Lazy-load 類似函數(shù)式語言的懶功能,只有使用時(shí)才真正執(zhí)行。 真正可伸縮性 通過與JMS結(jié)合,可以在多核或多個(gè)服務(wù)器之間彈性擴(kuò)展。異步懶加載好處 即用即取數(shù)據(jù),隨時(shí)運(yùn)算。 函數(shù)功能只有在

12、它的返回結(jié)果需要時(shí)才真正執(zhí)行計(jì)算,類似erlang Scala等函數(shù)式語言。 再也Hibernate LazyInitializationExceptions錯(cuò)誤煩惱, 沒有Session持續(xù)打開(Session打開就是數(shù)據(jù)庫連接一直打開,耗費(fèi)資源,性能殺手) 不需要Open Session in View 反模式,不再需要使用SSH或S2SH組合中,在web.xml配置Spring的OSIV過濾器,這時(shí)耗費(fèi)資源和危險(xiǎn)的,特別是嵌套錯(cuò)誤拋出時(shí)。 可以在MessageListener處集成入JMS,JMS是可伸縮性并帶有分布式事務(wù)方案,可以保證持久化等事務(wù)精確完成。模型的異步 + 懶加載假設(shè)假設(shè)

13、computeCount是一個(gè)非常耗是一個(gè)非常耗CPU的任務(wù),使用的任務(wù),使用并發(fā)策略可以消除并發(fā)策略可以消除這種延遲這種延遲。public int getMessageCount(DomainEvents domainEvents) if (messageCount = -1) if (messageCountAsyncResult = null) messageCountAsyncResult = domainEputeCount(account.getUserIdLong(); else messageCount = (Integer) messageCountAsyncResult.g

14、etEventResult(); return messageCount; 異步調(diào)用 第一次調(diào)用 getMessageCount方法,激活耗時(shí)的 domainEputeCount. 方法,這次調(diào)用中我們可以不需要范圍結(jié)果。 第二次再次調(diào)用getMessageCount將得到前面耗時(shí)的計(jì)算結(jié)果,我們可以通過AJAX實(shí)現(xiàn)二次調(diào)用。 Download Sample Source集成JMS Component(“JMSListener ”) public class JMSListener implements MessageListener public void action(DomainMess

15、age message) Connection connection = connectionFactory.createConnection(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); MessageProducer producer = session.createProducer(destination); TextMessage message = session.createTextMessage(message.getSource); producer.send(me

16、ssage); 分布式CAP原理 Consistency(一致性), 數(shù)據(jù)一致更新 Availability(可用性), 響應(yīng)性能 Partition tolerance(分區(qū)容錯(cuò)性) 可靠性 只可同時(shí)滿足二點(diǎn),沒法三者兼顧。 架構(gòu)設(shè)計(jì)師不要精力浪費(fèi)在如何設(shè)計(jì)能滿足三者的完美分布式系統(tǒng),而是應(yīng)該進(jìn)行取舍。 Web系統(tǒng)分服務(wù)器端和RIA瀏覽器,實(shí)際也是一個(gè)分布式系統(tǒng)。互聯(lián)網(wǎng)是最成功的分布式系統(tǒng)。CAP原理實(shí)現(xiàn) 關(guān)系數(shù)據(jù)庫ACID模型實(shí)現(xiàn)了CAP原理的一致性和可靠性,但是失去了響應(yīng)性能可用性。 Dynamo和Base思想實(shí)現(xiàn)了CAP原理的響應(yīng)性能 和一部分可靠性,降低了一致性要求。所以。 基于模型

17、緩存緩存的Jdon框架如果結(jié)合關(guān)系數(shù)據(jù)庫,可以讓架構(gòu)師靈活選擇以上兩種思想傾向。Dynamo思想 一個(gè)Dynamo框架應(yīng)該是這樣:邏輯隨著數(shù)據(jù)分布,任何模型都可以自己持久化,這樣做的優(yōu)點(diǎn)是系統(tǒng)有低延遲。 當(dāng)Jdon框架應(yīng)用部署在分布式環(huán)境中時(shí),模型只要向所在的服務(wù)器技術(shù)組件通過Domain Events 和JMS發(fā)出持久化即可。 邏輯和數(shù)據(jù)都在模型中,完全符合Dynamo框架的“符合邏輯隨著數(shù)據(jù)分布”定義。 可伸縮架構(gòu)變遷之路Action少量業(yè)務(wù)Service業(yè)務(wù)邏輯失血模型基本邏輯(約束一致性方法)DDD充血領(lǐng)域模型薄Service薄Action分布式可伸縮方向等等使使用DDD后的架構(gòu)傳統(tǒng)老

18、架構(gòu)JF分布式架構(gòu)Domain ModelJMSPersistenceSend EmailOther ServicesMessageDomain ModelMessageDistributed CacheDistributed Cache基于領(lǐng)域模型的分布式架構(gòu) 領(lǐng)域模型 + 分布式緩存緩存 + 存儲(chǔ) + JMS異步 領(lǐng)域模型帶著邏輯和數(shù)據(jù)被分布式緩存緩存如Ehcache +Terracotta分布到多臺(tái)機(jī)器中運(yùn)行。 領(lǐng)域模型通過JMS驅(qū)動(dòng)技術(shù)架構(gòu)實(shí)現(xiàn)功能。 JMS= 集群集群無單點(diǎn)+分布式事務(wù)事務(wù)架構(gòu) 業(yè)務(wù)數(shù)據(jù)裝在領(lǐng)域模型中,關(guān)系數(shù)據(jù)庫只是用來做存儲(chǔ),NoSQL(Not Only SQL),

19、領(lǐng)域模型數(shù)據(jù)和數(shù)據(jù)庫數(shù)據(jù)不高度一致,低延遲。JdonFramework特點(diǎn) DDD : 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì),通過突出領(lǐng)域模型作為整個(gè)系統(tǒng)的中心作用,以領(lǐng)域模型的設(shè)計(jì)驅(qū)動(dòng)表現(xiàn)層和數(shù)據(jù)庫的開發(fā)設(shè)計(jì)。 IOC或DI:完全自動(dòng)識(shí)別的依賴注射模式,可以完全擺脫類與類之間的依賴關(guān)系,大大提高開發(fā)效率和重構(gòu)速度。 Cache:內(nèi)置緩存自動(dòng)支持,借助Terracotta能夠無縫將應(yīng)用程序拓展到云計(jì)算架構(gòu)。Ioc/AOP輕量容器 依賴或或者控制關(guān)系的反轉(zhuǎn)注射(Ioc模式)p通過配置/微容器解決POJO調(diào)用關(guān)系。p高度靈活和松耦合,實(shí)現(xiàn)對(duì)象的可更換。 面向方面編程(AOP)p提供在不改變?cè)瓉砑軜?gòu)基礎(chǔ)上,動(dòng)態(tài)增加/更換一

20、些普遍功能。 Out-of-the boxJF注射和攔截架構(gòu) Model:模型中可以通過字段的Inject將其他類注射進(jìn)入,包括Component類。被注射的類如果有Introduce,將再次引入攔截器。 Component:技術(shù)架構(gòu)中組件可以通過構(gòu)造器直接注射進(jìn)入其他Component組件,被注射的類如果有Introduce,將再次引入攔截器。靈活的注入和攔截 依賴注入Dependency Injection(DI or IOC) Service or Component 能夠進(jìn)行彼此注入,通過其類構(gòu)造器 (不支持 setter方法注入). Service or Component也能被注入

21、到 Model 領(lǐng)域模型中,或者使用 domain events. 面向方面編程Aspect-oriented programming(AOP) 使用Introduce: Service or Component 能夠?qū)⒈舜艘胱鳛閿r截器. Model 能引入任何 POJO 或 Component作為它的攔截器DI/AOP架構(gòu): ModelClientxx.getA(“a”)AModelInterceptor for Awith Introduce B that needimplements interfaceand has IntroduceInject proxy of BIntercep

22、tor for Bwith IntroduceCache containerCInject proxy of cComponentIn Context Containerinterceptor模型內(nèi)注射DI/AOP架構(gòu): ComponentClientxx.getA(“a”)A ServiceInterceptor (poincut=service)B that needimplements interfaceComponentInject proxy of BInterceptor for Bwith IntroduceContext container (ServletContext)如何

23、調(diào)用一個(gè)有依賴的服務(wù)?AOP Introduce使用方法 Introduce(名稱) 為當(dāng)前類引入攔截器,可以用在Model或Component中,名稱是攔截器的Component(名稱). 例如Introduce(c) - Component(“c”) 在當(dāng)前類具體方法上使用Before After和Around三種攔截器激活的方式。注意使用Around對(duì)攔截器有特定寫法要求,其他無。Introduce 引入攔截器被Introduce 引入的攔截器Component(c)public class C /被攔截器的Input參數(shù)將注射到inVal中 public Object testOne(

24、Object inVal) . /testOne 方法return 結(jié)果將被注射到被攔截器的return中 /被攔截器的方法myMethod2返回值將被引入此方法的inVale public Object testWo(Object inVal) Introduce的Around 如果某個(gè)類似于Introduce的Around,那么對(duì)被引入的攔截器有特殊要求寫法:Interceptor(“aroundAdvice”)/1. 需要表明自己是Inteceptorpublic class AroundAdvice implements MethodInterceptor /2.需要實(shí)現(xiàn) org.ao

25、ercept.MethodInterceptor接口 /3.完成接口的Invoke方法 public Object invoke(MethodInvocation invocation) throws Throwable Object o = ceed();/在此方法前后寫包圍around代碼。 JF攔截器第二種寫法/1. 指定被攔截的類是Component(“a”)和Component(“c”)Interceptor(name = myInterceptor, pointcut = a,c)public class MyIntercept

26、or implements MethodInterceptor /2.需要實(shí)現(xiàn) ercept.MethodInterceptor接口 /3.完成接口的Invoke方法public Object invoke(MethodInvocation methodInvocation) throws java.lang.Throwable 被攔截器的類沒有特別規(guī)定寫法,只要標(biāo)注Component(“a”)就可以,至于攔截a的什么方法,在攔截器invoke中實(shí)現(xiàn)。該方式將攔截定義在攔截器這里,和Introduce定義正好相反。自動(dòng)注射的兩個(gè)優(yōu)勢 完全可定制:面向?qū)ο缶?/p>

27、程之父Grady Booch 說:對(duì)象最偉大之處在于其可被替代(The great thing about objects is they can be replaced) 而JF偉大之處是幫助你替代這些對(duì)象,甚至包括JF本身本身。 無需對(duì)象創(chuàng)建:顛覆對(duì)象使用之前必須創(chuàng)建的基本定律,正象無需關(guān)心對(duì)象銷毀一樣,您可以無需關(guān)心對(duì)象創(chuàng)建。JdonFramework特點(diǎn) DDD : 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì),通過突出領(lǐng)域模型作為整個(gè)系統(tǒng)的中心作用,以領(lǐng)域模型的設(shè)計(jì)驅(qū)動(dòng)表現(xiàn)層和數(shù)據(jù)庫的開發(fā)設(shè)計(jì)。 IOC:完全自動(dòng)識(shí)別的依賴注射模式,可以完全擺脫類與類之間的依賴關(guān)系,大大提高開發(fā)效率和重構(gòu)速度。 Cache:內(nèi)置緩存

28、自動(dòng)支持,借助Terracotta能夠無縫將應(yīng)用程序拓展到云計(jì)算架構(gòu)。第三個(gè)特點(diǎn): Cache 業(yè)務(wù)層可直接操作緩存,便于將業(yè)務(wù)狀態(tài)保存到緩存中,實(shí)現(xiàn)以對(duì)象狀態(tài)替代數(shù)據(jù)庫進(jìn)而提升性能的設(shè)計(jì)目的。 Jdon緩存在具體架構(gòu)應(yīng)用時(shí)可靈活設(shè)置在表現(xiàn)層/業(yè)務(wù)層/持久層等位置,通過攔截器使表現(xiàn)層訪問緩存(依據(jù)緩存越提前越快原理);JF緩存架構(gòu)PresentationDomainPersistenceCacheInterceptorIn aspect.xmlDomainCacheInteceptorIntroduce(“modelCache”)JF緩存特點(diǎn) 只要標(biāo)識(shí)Model的實(shí)體,在表現(xiàn)層Jsp頁面再次使

29、用時(shí),將自動(dòng)直接從緩存中獲得,因?yàn)樵谥虚g業(yè)務(wù)層和表現(xiàn)層之間Jdon框架存在一個(gè)緩存攔截器CacheInterceptor,見框架的aspect.xml中配置。 為了能夠在業(yè)務(wù)層也能夠使用緩存,需要在業(yè)務(wù)層后面的持久層或Repository中手工加入緩存的Annotation標(biāo)簽。使用Annotation激活Cache在模型對(duì)象被創(chuàng)建或從數(shù)據(jù)庫讀取重構(gòu)的地方必須加入Introduce(“modelCache”) 注解,這一步對(duì)于使用domain events是必須關(guān)鍵重要步驟Cache高可伸縮性 1. 使用JF開發(fā)的應(yīng)用系統(tǒng)可無縫平滑升遷到EJB架構(gòu)。同時(shí)支持POJO Services和EJB混

30、合運(yùn)行,可接駁原有的EJB系統(tǒng)。 2.使用Terracotta透明輕量地分布式云計(jì)算內(nèi)存產(chǎn)品,可以無縫將應(yīng)用程序升級(jí)到云計(jì)算平臺(tái)??筛鶕?jù)分布式CAP原理靈活架構(gòu)。 (http:/ )JdonFramework其他特點(diǎn) 快速開發(fā),簡化代碼,模型的CRUD操作流程固化,模板化編程。 CQRS模式:命令查詢的責(zé)任分離Command Query Responsibility Segregation 。 模型狀態(tài)的操作和批量查詢分離,提供專門的批量查詢支持。 支持遠(yuǎn)程胖客戶端簡化代碼:杜絕Controller代碼 MVC框架中的控制器/Action作用只是做前后臺(tái)通訊轉(zhuǎn)發(fā),不能將多個(gè)功能混入控制器中,更不能寫入業(yè)務(wù)。 JF采取MVC配置替代控制器/Action代碼編寫,從架構(gòu)上杜絕了初級(jí)程序員將更多業(yè)務(wù)代碼寫入Controller/Action的可能。 節(jié)省編寫Action代碼工作,提高開發(fā)效率,實(shí)現(xiàn)MVC流程CRUD快速開發(fā)。MVC流程CRUD快速開發(fā) 應(yīng)用軟件中大量底層基礎(chǔ)功能是CRUD (創(chuàng)建讀寫修改和刪除),調(diào)試耗時(shí)而且不穩(wěn)固。 傳統(tǒng)開發(fā)中,一個(gè)模型的CRUD需要多個(gè)流程實(shí)現(xiàn),沒有技術(shù)含量的煩瑣和麻煩。 JF將CRUD流程簡化捆綁在配置,CRUD中只要?jiǎng)?chuàng)建功能調(diào)試正常,其他也就正常,無須煩瑣調(diào)試。提高基礎(chǔ)功能的調(diào)試時(shí)間。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論