Apworks框架實戰(一):Apworks到底是什麼?

dax.net發表於2014-04-01

簡介

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攔截的解決方案

Apworks為軟體系統的設計和開發帶來了真正的穩定性、便捷性和靈活性,本文將對Apworks的各個方面進行展示,以向開發人員介紹框架的使用方式。

演示案例

Byteart Retail

在我之前的部落格文章中,有一個對Byteart Retail案例進行介紹的系列文章。Byteart Retail就是遵循的面向領域驅動的軟體架構模式(經典分層架構)。在Byteart Retail案例推出之後,受到了廣大網友的關注,也有網友將Byteart Retail案例與Apworks框架進行整合,以演示Apworks框架對面向領域驅動的企業級軟體設計和架構的支援。由Apworks支援的Byteart Retail的案例原始碼地址是:https://github.com/daxnet/ByteartRetail_Apworks。需要了解Byteart Retail案例詳細資訊的讀者,請參見:https://github.com/daxnet/ByteartRetail。在此對線上上和線下社群中為Apworks提供支援的網友表示衷心感謝!

Note Service

在Apworks上一個版本釋出的時候,我在部落格中給出了一個使用Apworks開發的Web API案例,文章題目是:《在ASP.NET MVC Web API中使用Apworks開發第一個HTTP服務》。在文中介紹了配置和使用。在本系列的後續文章中,我將詳細介紹Apworks框架的具體應用。

Note Service擴充套件:對NancyFx的支援

在此對網友止.觀.表示衷心的感謝。該案例詳細講解了Apworks在NancyFx中的應用。原文標題是:《擴充套件NoteService,支援NancyFx》

在下一篇文章中,我將介紹Apworks框架的下載、編譯和引用。

相關文章