基於nopCommerce的開發框架(附源碼)

 .NET的開發人員應該都知道這個大名鼎鼎的高質量b2c開源項目-nopCommerce,基於EntityFramework和MVC開發,擁有透明且結構良好的解決方案,同時結合了開源和商業軟件的最佳特性。官網地址:http://www.nopcommerce.com/,中文網:http://www.nopcn.com/。下載後前後端展示如下。如果你還未了解過該項目,建議從官網下載代碼後在本地運行查看效果。

  筆者使用該框架開發過不少項目,總的來說,方便簡潔,集成了.NET開發許多常用的組件和功能。一直想將它分享出來,但忙於工作而沒有達成,最近也是有時間來寫這篇文章,本文將展示如何提取該源碼的精簡框架並附上源碼(基於nopCommerce3.9版本)。如果你想了解框架結構,通過該框架來開發項目,那麼看一遍該文章是有價值的。前排提示:本框架源碼已上傳到GitHub:https://github.com/dreling8/Nop.Framework,有興趣的可以關注該項目,後續會將其它的一些通用模塊添加進去,如用戶管理(IWorkContext 工作上下文)、插件功能、任務模塊(taskservice)、日誌、緩存、本地化等。歡迎star給星星,你的支持是我的動力!  

   

  

 

 一、瞭解項目結構

  從項目結構圖中我們也可以看出Nop的層次劃分非常清晰,先看我畫的層次圖

   

  

 

  1. 展現層(Presentation)

  也可稱之爲應用層,只關注前端的整合,不涉及任何領域邏輯實現。這一層只做展現,對我們框架來說是可有可無的,因此提取框架時會將該層刪除。

  2. 業務服務層(Nop.Services)

  整個系統的服務層,提供了對每個領域的接口和實現。這一層非常重要,提供了程序內對展現層的接口服務,不論展現層使用mvc,還是使用winform,異或是給app調用的webapi接口,都需要該層服務。但該層的服務主要是電商的一些服務,對我們框架無用,因此在這個框架中會刪除所有服務,只添加一個測試服務類和接口,應用到項目中你應該在該層添加接口和服務。

  3. 數據層(Nop.Data)

  nop在數據層的倉儲實現中使用了ef和sqlserver數據庫,如果你想擴展,也可以在該層使用其它的ORM映射庫和數據庫。這一層的大部分功能我們會在框架中將保留。

  4. 基礎設施層(Nop.Core)

  包括緩存的實現、配置、領域模型等等。在框架中會保留一部分功能,並將Domain領域模型移出該層做單獨項目,爲什麼要這樣做,因爲通常情況下,Domain層的調整會比較多,所以我一般將Domain做單獨Project,當然你也可以不調整,但框架做了該調整。

  二、刪除與業務相關的代碼

  我們已經對Nop的整個代碼層次結構有了瞭解,基於以下兩點開始修改項目源碼:1.框架足夠精簡,沒有任何電商業務。2.核心功能保留建議在開始前先copy一份源碼保留。

  1. Test項目:Tests文件夾下面是測試項目,不是必需的,將它全部移除,開發具體業務,可以再單獨添加測試項目。由於是測試項目,刪除後整個項目還能跑起來。

   

  2. Presentation展現層:這裏的三個項目,分別是前臺,後端和兩個項目共用的一些模塊。和測試項目一樣,這裏我們也全部移除。

   

  3. Plugin項目:插件項目,同1、2一樣,插件也不是必需的,移除所有的插件項目。現在只剩下三個項目了(歡迎關注該項目的github,後續我會專門寫篇文章介紹如何添加插件)。

   

  Nop.Services:業務服務層,這一層是程序集內對外接口層,需要保留。刪除所有相關的業務服務類,其中日誌、幫助、任務等跟系統相關的都刪除,目的是更好的展示整個系統的結構。添加一個測試類,暫時什麼都不寫。

   

  Nop.Data:數據層項目。這層基本不做調整,只刪除EF的Mapping映射相關類。

  Nop.Core:基礎設施層。刪除電商業務相關的Domain,新建項目Nop.Domain。

  報錯了,IWorkContext(工作上下文,用於獲取用戶信息等數據)依賴Domain,刪除它。這個過程可能要刪除不少文件,直到項目不再報錯。完成後我們的項目結構如下,注意我們將Nop.Core中的實體基類移到了Nop.Domain中,到這一步,我們的基礎框架結構已經大致出來了。

 

  三、添加數據庫、數據實體、映射、業務層代碼

  1. 在本地Sqlserver中,新建數據庫MyProject,添加表Test。

View Code

  2. 添加實體類和映射。在Domain項目下面新建Test目錄,添加TestEntity。Data項目Mapping下新建Test目錄,添加EF映射類。

View Code
View Code

  3. 添加業務層方法。

  在Nop.Services項目裏,在我們之前添加的接口和類下面添加幾個常用的CURD方法,並實現它。這樣我們就已經實現的業務層的代碼了。

View Code
View Code

  四、添加Presentation項目

  有了業務服務,現在可以添加表現層項目來測試了。爲什麼不直接寫測試項目?因爲測試項目使用Mock模擬數據,不能完整展示整個功能。

  1. 添加mvc模板項目,通過nuget引入Autofac和Autofac.Mvc5。

  2. 添加容器註冊類DependencyRegistrar,實現IDependencyRegistrar接口,這一步非常關鍵,我們將要用的接口和實現類注入到容器中。

View Code

  3. 配置文件中添加數據庫訪問節點

<add name="test" connectionString="Data Source=.;Initial Catalog=MyProject;Integrated Security=False;Persist Security Info=False;User ID=sa;Password=sa1234" providerName="System.Data.SqlClient" />

  4. 應用啓動時添加初始化引擎上下文

  啓動項目,這時NopEngine會報錯,因爲我們沒有使用Nopconfig來配置項目,在RegisterDependencies方法中註釋NopConfig的注入,同時在Initialize過程中將相關代碼註釋。這樣就完成通過Autofac注入類到容器中。

View Code
View Code

  5. 在controller添加測試代碼。將service添加到HomeController,在構造函數中初始化。系統啓動後會自動注入實例。通過斷點我們看到,數據成功添加到了數據庫。

View Code

  五、擴展到Webapi、Winform、WPF

 

  現在再添加一個winform項目,同樣的步驟添加相關的代碼。在Winform中我們也能使用業務的服務了。

  1. 通過Nuget安裝autofac,entityframework, 添加項目Libraries下的引用。

  2. 添加依賴註冊類,因爲是winform項目,DependencyRegistrar這裏需要做些調整,建議定義一個空接口IRegistrarForm,需要注入的Form實現IRegistrarForm。

View Code

  3. 在啓動時添加 EngineContext.Initialize(false),啓動項目,報錯了,因爲winform不能執行,對方法做些調整,添加一個參數isForm表示是否是winform,默認爲false。

View Code
View Code

  4. From1中測試,成功調用了業務層的方法,這裏我們並沒有實例化ITestService,而是交給依賴注入自動實現。

View Code

 

至此,基於Nop的精簡開發框架基本完成,如果你有興趣,建議在github關注該項目 :https://github.com/dreling8/Nop.Framework

發佈了577 篇原創文章 · 獲贊 459 · 訪問量 484萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章