Apworks企業(yè)級開發(fā)框架
簡介
Apworks是一款基于Microsoft .NET的面向領域驅動的企業(yè)級應用程序開發(fā)框架,它適用于以領域模型為核心的企業(yè)級系統(tǒng)的開發(fā)和集成。Apworks不僅能夠很好地支持經典的分層架 構,而且還能支持基于事件驅動的命令查詢職責分離(Command-Query Responsibility Segregation, CQRS)架構。
隨著軟件系統(tǒng)日趨復雜,構建一套可用的、穩(wěn)定的、可擴展的、安全的以及高效的系統(tǒng)變得越來越困難。為了解決這樣的困 難,人們在多年的軟件開發(fā)過程中積累了不少經驗,由其是在大型復雜軟件系統(tǒng)方面,面向對象的分析和設計(OOAD)占據(jù)著主導地位。由此,Eric Evans將這些經驗整理成文,于2004年出版了《領域驅動設計:軟件核心復雜性應對之道》一書,世界頂級軟件架構大師Martin Fowler也參與了該書的編撰工作。
在書中,Eric Evans提出了軟件的設計與架構應當以領域為核心,而不是數(shù)據(jù)庫或者其它的軟件基礎結構,因為領域描述了軟件所需解決的實際問題。在設計和架構階段,軟 件開發(fā)人員與領域專家必須建立一套用于交流的“通用語言”,并基于這套語言來共同建立領域模型。整個軟件的設計與架構就需要以這個領域模型為中心,這樣做 不僅能夠讓開發(fā)團隊更好地理解業(yè)務需求,減少因需求理解和溝通引起的偏差,而且還能使核心部件獨立于具體的軟件技術實現(xiàn),為今后的新技術革新和擴展做好充 分準備。
領域驅動設計并不是一種特定的模式,也不是一種具體的方法論,它所涵蓋的范圍相當廣泛,比如,面向對象分析與設計的基本原則、 測試驅動開發(fā)、行為驅動開發(fā)、持續(xù)集成、敏捷開發(fā)、防腐層、界定上下文、分層體系結構模式、讀寫分離體系結構模式、事件驅動體系結構模式等等,都屬于領域 驅動設計的討論范疇。總而言之,所有以領域模型為核心的開發(fā)方法、過程與技術,均可認為是領域驅動的。
為了能讓這些開發(fā)技術、開發(fā)方 法、以及軟件設計原則與模式能夠很好地運用到實際項目中,一些面向領域驅動設計的開發(fā)框架應運而生,比如Java陣營有非常知名的 AxonFramwork和JdonFramework。這些框架對領域驅動設計中所涉及的基本概念和模式都有著很好的支持,這不僅讓開發(fā)人員能夠很方便 地開發(fā)出專業(yè)的、面向領域驅動的軟件系統(tǒng),使得軟件系統(tǒng)能夠更好地滿足客戶需求,解決實際的業(yè)務問題,而且在安全性、高效性、可擴展性和可維護性方面為軟 件系統(tǒng)提供保障,大大提高了軟件產品的質量。
由于軟件需求具有多樣性和可變性的特點,往往沒法在項目的前期將所有需求完全確定下來,因 此,對于日趨復雜的軟件系統(tǒng)而言,傳統(tǒng)的瀑布開發(fā)模型遇到了一定的挑戰(zhàn),而基于迭代的敏捷開發(fā)模式相對而言更能有效地解決需求的多樣性和可變性所帶來的潛 在風險。由于迭代的引入,客戶能夠直接參與到開發(fā)過程中,并在迭代中為開發(fā)團隊提供必要的信息,以保證軟件系統(tǒng)本身不會與客戶需求相差太遠。每一次迭代都 會實現(xiàn)一部分客戶需求,因此,經過多次迭代,程序代碼也會迭代地加入到代碼庫中。為了確保質量,保證新加入的代碼不會影響上一次迭代中所產生的代碼,開發(fā) 團隊往往采用持續(xù)集成的方式,將代碼整合到代碼庫的主分支上。
持續(xù)集成也涵蓋了很多技術手段,比如行為驅動開發(fā)(BDD)、測試驅動開 發(fā)(TDD)、自動化測試以及自動化部署等等。而面向對象分析與設計的原則,又對敏捷開發(fā)實踐提供了很好的技術支撐,相信讀過Robert C. Martin所著的《Agile Principals, Patterns and Practices in C#》一書的讀者,對這部分會有很深的感觸。
由此可見,面向領域驅動設計的開發(fā)框架,對敏捷項目的實踐也有著很大的幫助,主要表現(xiàn)在以下幾個方面:
-
框架在技術上為軟件系統(tǒng)提供了完整的模式實踐,例如:通過使用AxonFramework或者JdonFramework,可以很方便地實現(xiàn)基于CQRS或者事件驅動的體系結構
-
框架為團隊提供了合理可行的軟件開發(fā)過程模式,例如:利用框架可以很方便快捷地搭建軟件系統(tǒng)的解決方案,同時也決定了團隊的開發(fā)過程和合作方式
-
框架的應用大大提高了團隊的開發(fā)效率,團隊只需要關注與領域相關的業(yè)務實現(xiàn),而無需關注具體的技術實現(xiàn)
-
框架的應用大大降低了出現(xiàn)缺陷(Bug)的幾率,因為大多數(shù)支撐業(yè)務系統(tǒng)的代碼都經過了嚴格的測試和實戰(zhàn)的考驗
-
框架的應用還為軟件系統(tǒng)的整合與集成帶來了便捷
Apworks就是一套在.NET下支持面向領域驅動的軟件系統(tǒng)開發(fā)框架,它具有以下這些特點:
-
基于NuGet Package Manager提供方便快捷的類庫包發(fā)布方式,開發(fā)人員無需關心程序集之間的版本依賴關系
-
提供對領域驅動設計中基本元素的封裝。比如:Apworks框架對實體、聚合根、領域事件、領域倉儲、事件存儲(Event Store)等概念進行了有效的封裝和實現(xiàn)
-
提供對現(xiàn)有流行框架的支持。比如:Apworks能夠很好地支持AutoMapper、Nancy Framework、ASP.NET MVC以及ASP.NET Web API的使用和開發(fā)
-
提供多樣化的配置方式。開發(fā)人員可以在web/app.config中對Apworks框架進行配置,也可以直接在程序代碼中構建配置對象,對框架進行配置。流暢接口(Fluent Interface)的引入,更是為Apworks框架的配置提供了便捷直觀的編程體驗
-
提 供基于Microsoft Patterns & Practices Unity的IoC容器和服務定位器(Service Locator)的實現(xiàn)。不僅如此,開發(fā)人員還能根據(jù)項目的實際需求對IoC容器和服務定位器進行擴展,使其能夠支持更多的Dependency Injection(DI)框架。比如可以很方便地擴展Apworks,使其能夠支持基于StructureMap、Ninject等流行的DI框架
-
提 供基于Entity Framework和NHibernate兩種流行ORM的倉儲實現(xiàn)。在應用程序中使用這兩種倉儲,也就基本涵蓋了所有面向關系型數(shù)據(jù)庫的對象持久化方 案。Apworks還提供基于MongoDB的NoSQL對象持久化方案,以滿足NoSQL解決方案的需求。不僅如此,開發(fā)人員還能根據(jù)項目的實際需求, 對倉儲實現(xiàn)進行擴展,以支持更多種類的對象持久化機制
-
提供包括Event Aggregator、MSMQ以及Direct Local Bus的事件和消息派發(fā)機制。開發(fā)人員能夠很方便地將領域事件派發(fā)到消息總線上,為應用系統(tǒng)的集成提供便捷。不僅如此,開發(fā)人員還能根據(jù)項目的實際需求, 對消息派發(fā)機制進行擴展,甚至可以結合NServiceBus以及Microsoft Biztalk Server等企業(yè)級服務總線,實現(xiàn)復雜的消息路由和處理
-
為CQRS架構提供了靈活的、基于SQL Server以及MySQL的事件存儲(Event Store),不僅如此,開發(fā)人員還能根據(jù)項目的實際需求,對事件存儲的實現(xiàn)進行擴展,以支持更多種類的存儲機制
-
為CQRS架構提供了多樣化的領域倉儲的實現(xiàn)。開發(fā)人員可以根據(jù)項目的實際需要來選擇或者擴展領域倉儲,比如可以選擇僅將事件快照作為事件存儲的倉儲實現(xiàn),來屏蔽事件回溯的功能,從而達到節(jié)省空間的目的
-
為CQRS架構提供了可擴展的事件快照機制。開發(fā)人員可以通過簡單的配置來決定是否使用事件快照,并定制事件快照的屬性和行為
-
提 供了對AOP攔截的支持:通過引入Castle Dynamic Proxy,Apworks框架可以很方便地實現(xiàn)面向接口方法的AOP攔截;開發(fā)人員還可以根據(jù)項目的實際需求,選用由DI框架支持的AOP攔截方案,比 如,可以選用Unity Policy Injection Extension作為AOP攔截的解決方案。
