HappyFramework是一個支持DDD、CQRS、OSGI、EPC、EventDriven、MetadataDrivenProgramm理念的開源框架,而且她是可以實戰的。
不要被上邊的話給欺騙了,當然了,其實也沒有欺騙大家,只是HappyFramework的CQRS、OSGI、EPC、EventDrivent、MetadataDrivenProgramming都是實現的很簡單,全是限制在AppDomain內和僅支持單線程。這並不代表不可以跨越AppDomain甚至無理進程,或者支持多線程,只是如果想做到這一步,已經有很多的框架提供此類功能了,如:NServiceBus之類的框架。而HappyFramework可以和他們結合起來一起使用的。
下面對整個框架的組織方式和理念做一個簡單的介紹,有朋友想閱讀這個框架也可以按照這個順序。
項目組織方式(忽略對單元測試項目的介紹)
- Happy,此項目包含了所有基類和接口,不對其它項目有任何引用。
- Happy.Data.EntityFramework,使用EntityFramework實現了倉儲和工作單元,后面計划提供Happy.Data.HHibernate,CQRS的Command部分的數據庫訪問代碼會使用此空間。
- Happy.Data.FluentData,使用FluentData實現了查詢服務和查詢數據源,CQRS的Query部分的數據訪問代碼會使用此空間。
- Happy.EnterpriseLibrary,使用了EnterpriseLibrary實現了日志功能和異常管理功能。
- Happy.Ioc.Unity,使用Unity管理AppDomain內的服務,實現了IBundleContainerPlug,當Bundle啟動的時候根據約定注冊類型到Unity中,當Bundle停止的時候根據約定取消類型的注冊;提供了IUnityRegister接口,當Bundle啟動時會自動調用所在Assembly中實現了此接口的類型,開發人員可以實現這個接口來自定義注冊。
- Happy.Web.Mvc,重寫了ControllerFactory,以支持識別動態加載的Bundle中的Controller,而且當Bundle停止時,要取消對相應Conroller的識別。
Happy.DesignByContract介紹
“Happy.DesignByContract”命名空間下的代碼基本全是拷貝自“sharparchitecture”,對於契約式開發,我還沒有深入了解,正在學習中。
“sharparchitecture”下載地址:http://sharparchitecture.net/。
Happy.Specifications介紹
“Happy.Specifications”命名空間下的代碼基本全是拷貝自“microsoftnlayerapp”,其理念基礎是領域驅動設計的“規約模式”,我之所以沒有將其組織到“Happy.Domain”命名空間的原因是“Happy.Queries”命名空間也需要“規約模式”。
關於規約模式我是這么理解的,規約分查詢規約、創建規約、驗證規約,其中查詢規約又分數據庫查詢規約和內存查詢規約,“Happy.Specifications”命名空間下實現的是“數據庫查詢規約”,也叫“查詢對象”,其它規約類型我會提供獨自的繼承體系。
“microsoftnlayerapp”下載地址:http://microsoftnlayerapp.codeplex.com/。
Happy.Logging介紹
“Happy.Logging”的開發受到了“log4net”的影響,原本我想用其提供的NuGet包進行開發,后來之所以
決定引入隔離接口,有如下原因:
-
- 我不希望綁定到特定的日志實現。
- 不希望依賴太多外部程序集。
核心類型說明:
-
- ILoger :完全拷貝自“log4net”。
- ILogerFactory :簡單工廠模式。
- LogHelper :門面模式。
- EmptyLoger :NullObject模式。
- EmptyLogerFactory:NullObject模式。
“log4net”下載地址:http://logging.apache.org/log4net/。
Happy.ExceptionHandling介紹
“Happy.ExceptionHandling”的開發受到了“ENTERPRISE LIBRARY”的影響,原本我想用其提供的NuGet包進行開發,后來之所以決定引入隔離接口,有如下原因:
-
- 我不希望綁定到特定的日志實現。
- 不希望依賴太多外部程序集。
"ENTERPRISE LIBRARY"下載地址:https://entlib.codeplex.com/。
Happy.ExtensionMethods介紹
“Happy.ExtensionMethods”命名空間下的代碼基本全是拷貝自“Craig's Utility Library”,原本我想用其提供的NuGet包進行開發,后來之所以決定進行拷貝式復用,有如下原因:
-
- 我只需要簡單的功能。
- 拷貝的過程也是我學習的過程。
- 不希望依賴太多外部程序集。
“Craig's Utility Library”下載地址:http://cul.codeplex.com/、http://www.gutgames.com/。
Happy.Messaging介紹
“Happy.Messaging”的開發受到了“sharparchitecture”的影響,其理念基礎是“命令模式”、“發布訂閱模式”、“管道過濾器模式”,我准備使用三種消息機制,DomainEvent、ApplicationEvent、Command,他們三者共享一個一個基類框架(Happy.Messaging)。
關於DomainEvent、ApplicationEvent、Command的一些簡單使用場景:http://www.cnblogs.com/happyframework/archive/2013/03/09/2949838.html
核心類型說明:
-
- IMessage :消息實體,多數場景只包含數據。
- IMessageHandler :消息處理器,一個消息對應多個消息處理器。
- MessageScene :消息場景,一個消息可以使用在多個場景中,每個消息處理器只能用在一個場景中。
- IMessageFilter :消息攔截器,一個消息被發送到消息處理器之前,會經過多個消息攔截器。
- IMessagePipeLine :消息管道,代表了一個消息從發送、經過過濾器、再到處理器處理的整個過程。
- MessageFilterAttribute :消息攔截器標簽,將某個消息攔截器應用到指定的消息上。
- MessageBus :消息總線,代表一個AppDomain內消息總線。
“sharparchitecture”下載地址:http://sharparchitecture.net/。
Happy.OSGI介紹
“Happy.OSGI”命名空間實現了簡單的OSGI思想,OSGI的核心理念是管理Bundle的生命周期(安裝、啟動、停止)。
核心類型說明:
-
- Bundle :Bundle實例,你可以啟動它、停止它,但是不能卸載它。
- BundleAttribute :Bundle標注,程序集被標注后,就會被識別為一個Bundle。
- BundleContainer :Bundle容器,一個AppDomain只有一個BundleContainer,它來管理所有Bundle實例。
- BundleContext :Bundle上下文,代表了Bundle當前的上下文信息,在IBundleListener被調用時,會傳遞給IBundleListener的Start和Stop方法。
- BundleData :Bundle元數據,代表了一個Bundle的原信息,目前只有Assembly,后面會擴充更多信息。
- IAssemblyLoader :程序集加載器,BundleContainer可以使用多個程序集加載器加載Bundle。
- IBundleContainerPlug :BundleContainer插件,Bundle的Start和Stop方法執行時,會自動調用的所有IBundleContainerPlug,如:Ioc自動注冊插件可以自動注冊Ioc容器。
- IBundleListener :Bundle監聽者,Bundle的Start和Stop方法執行時,會自動調用Bundle所在Assembly的所有IBundleListener。
Happy.Domain介紹
“Happy.Domain”命名空間下的代碼借鑒了“microsoftnlayerapp”,其理念基礎是領域驅動設計。
“microsoftnlayerapp”下載地址:http://microsoftnlayerapp.codeplex.com/。
Happy.Queries介紹
“Happy.Queries”命名空間封裝了UI層常用的查詢API,此命名空間體現了CQRS的Q。關於如何處理系統的查詢,我是這么
理解的,代碼中不要出現復雜的查詢,復雜的查詢應當放到數據庫中,通過存儲過程或視圖實現,程序中只能出現簡單的Where查詢。
元數據驅動開發也會在該層體現,通過為ViewModel設置應有的元數據,可以在編譯時或運行時自動生成UI。
Happy.Commands介紹
“Happy.Commands”繼承“Happy.Messaging”的所有實現,為Create、Deleting、Updating提供幾個常見的命令基類。CommandBus主要用在控制器層向應用層傳遞消息,即縱向傳遞。
Happy.Application介紹
“Happy.Application”繼承“Happy.Messaging”的所有實現,為Create、Deleting、Updating提供幾個常見的命令處理器基類。ApplicationBus主要用在業務模塊和業務模塊之間的消息傳遞,即橫向傳遞。
備注
還是有些亂,找個時間再重新整理一下。
