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