幸福框架:如何閱讀幸福框架的代碼


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主要用在業務模塊和業務模塊之間的消息傳遞,即橫向傳遞。

備注

還是有些亂,找個時間再重新整理一下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM