Apworks框架實戰(四):使用Visual Studio開發面向經典分層架構的應用程序:從EasyMemo案例開始

時隔一年,繼續咱們的Apworks框架之旅。在接下來的文章中,我將逐漸向你們介紹如何在Visual Studio中結合Apworks框架,使用ASP.NET Web API和MVC來開發面向經典分層架構的應用程序。在這一講中,咱們首先了解一下分層架構的各個「層」,以及所涉及的Visual Studio項目,而後,咱們從領域模型開始,在Visual Studio中開始咱們的應用程序開發之旅。html

說明:雖然如今微軟已經發布了Visual Studio 2015,但爲了照顧廣大的老版本用戶,本文及後續文章都會以Visual Studio 2013 with Update 4做爲開發工具進行介紹。此外,在某些場景中,會須要用到Visual Studio 2013 Ultimate的部分功能,因此,若是您所使用的Visual Studio不是Ultimate版本的話,您將沒法動手實踐某些案例,但您仍然能夠經過閱讀文章來獲取所須要的知識。git

Apworks的近況

已經有一段時間沒有向你們介紹Apworks框架的相關內容了,在最近的半年中,我對Apworks作了一些小的重構,具體內容以下:github

  1. 將支持的.NET Framework升級到4.5.1
  2. 開始在IEntity接口上支持泛型ID,這也就意味着在經典分層架構的Apworks應用中,實體鍵能夠開始支持多種原始數據類型了(組合鍵目前仍不支持),好比整形。這一改動不會對已有的框架產生任何影響,默認的實體鍵類型仍然是Guid
  3. 開始在Unit Of Work的具體實現,也就是RepositoryContext上支持異步Commit的操做:可使用CommitAsync來進行異步提交。後續版本會支持更多的異步方法
  4. 更新所依賴的第三方框架到最新版本(固然,在寫這篇文章時,這些第三方框架或許又有了版本更新)
  5. 改善了NHibernate Repository的實現
  6. 性能優化

您能夠直接點擊 https://github.com/daxnet/Apworks 進入Apworks框架的開源主頁,也可使用如下命令獲取Apworks的源代碼:數據庫

git clone https://github.com/daxnet/Apworks.git

案例:我的便籤應用

我又一次試圖從一個應用案例開始向你們介紹整個事情的前因後果,但願可以讓你們看清楚並瞭解到問題的本質。我記得以前也有不少文章我也是舉了很多例子,有的文章把例子講解完了,有的又是半途而廢,有始無終。好吧,無論怎麼樣,沒有案例就沒法一步步地將問題解釋清楚。畢竟理論也是須要跟實踐相結合的。安全

這個案例是一個我的便籤應用。剛開始的時候,我把這個小標題稱爲《案例:一個簡單的我的便籤應用》,思索以後將「一個簡單的」五個字去掉,我想,簡單的東西不是你們想要的,簡單的東西你們都會作,聽起來彷佛甚至不須要任何框架和工具的輔助,就能簡簡單單地把問題解決掉。我想向你們介紹的是一個完整的企業級應用,它不只應該實現基本的領域邏輯,更應該包含諸如安全、性能等各個方面的內容,因此,綜合起來,這事情就簡單不了。性能優化

認識個人圈內朋友應該都知道我本身開發了一個基於雲的我的筆記系統Cloud Notes,也有一些文章介紹Cloud Notes的技術和開發過程。不錯,如今我打算使用的這個案例,它的業務背景跟我的筆記系統很像,但爲了介紹技術部分,我會讓其業務變得更爲簡單,也會介紹一些實現RESTful服務的最佳實踐,所以,該案例會在技術架構層面與Cloud Notes相似,但也會有些細節上的差別。總而言之,儘可能以簡潔的形式來講明問題。架構

本案例涉及的部分包括用戶和權限,從業務上看,每一個用戶能夠管理本身的便籤,內容就這麼多。太複雜了會讓人以爲頭暈目眩,也會下降本文的可讀性。OK,讓咱們給這個案例起個名字,就叫EasyMemo吧。框架

理論:分層架構與技術選型

在我之前的博客中,少不了對分層架構的介紹,尤爲是在介紹領域驅動設計的時候,還介紹了與之異構的基於事件的命令查詢職責分離(CQRS)架構。本案例採用經典分層架構進行開發。在此,我以爲仍是有必要把架構圖再簡單畫一下,而且標註咱們將要使用的微軟技術。這樣作一方面可讓你們瞭解到咱們使用了哪些技術,另外一方面,在後續的介紹中,也可讓你們看到,咱們目前是在討論整個架構的哪一個部分。請參見下圖:異步

image

能夠看到,在整個案例的介紹過程當中,咱們將會使用Entity Framework 6做爲數據存儲ORM,後臺數據庫選用Microsoft SQL Server,領域模型層適配Apworks框架,應用層任務協調使用Apworks框架,而經過ASP.NET Web API 2向外界提供RESTful服務。表現層採用ASP.NET MVC 4加上AngularJS實現,固然會用到Twitter Bootstrap的一些特性,畢竟在標準的ASP.NET MVC模板中,默認安裝了Bootstrap的包。工具

基本架構就這樣,接下來,讓咱們一塊兒動手開始在Visual Studio 2013中搭建咱們的EasyMemo項目吧。

實踐:開始搭建解決方案

打開Visual Studio 2013,固然,目前咱們還不須要使用Ultimate版本,由於解決方案的搭建過程不會涉及任何與Visual Studio 2013 Ultimate相關的特性。爲了能讓解決方案中各項目的組織更爲合理,建議首先在Visual Studio 2013中新建一個空白的解決方案,.NET Framework版本請選擇4.5.1,由於從此要用的Apworks框架是基於4.5.1的:

image

單擊「肯定」按鈕後,Visual Studio就會在【解決方案資源管理器】中顯示一個空白的解決方案。接下來,咱們就相繼往該解決方案中建立如下新項目:

  • EasyMemo.Common:提供包括公共類型以及基礎結構層的那些能夠適用於其它各層的類型和組件
  • EasyMemo.Domain:包含領域模型的類型,以及這些類型的擴展方法
  • EasyMemo.Repositories:倉儲實現庫,提供與領域模型對象倉儲相關的類型定義以及實現
  • EasyMemo.Services:一個ASP.NET Web API應用程序,用以向外界提供RESTful服務。在【新建項目】對話中選擇【Visual C# –> Web】分類,在該分類中選擇【ASP.NET Web應用程序】,在彈出的【新建ASP.NET項目】對話框中,選擇【Empty】,在【爲如下對象添加文件夾和核心引用】分組中,選擇Web API:

    image
  • EasyMemo.Web:EasyMemo的主頁網站,向用戶提供操做界面,接收用戶請求,並將請求轉發到RESTful服務。在【新建項目】對話中選擇【Visual C# –> Web】分類,在該分類中選擇【ASP.NET Web應用程序】,在彈出的【新建ASP.NET項目】對話框中,選擇【MVC】:

    image

建立完成後,EasyMemo的解決方案中應該包含以下5個項目,每一個項目中都只包含了Visual Studio項目模板自帶的默認類型:

image

 

爲了可以在編譯整個解決方案的時候,讓Visual Studio自動下載每一個項目所依賴的NuGet包,強烈建議在EasyMemo解決方案上單擊鼠標右鍵,選擇【啓用NuGet程序包還原】選項:

image

 

如今,咱們就從領域模型的設計開始,一步步地完成整個應用程序的開發。

邁向領域建模的第一步

首先,在EasyMemo.Domain項目上,單擊鼠標右鍵,選擇【管理NuGet程序包】,在彈出的對話框的【搜索聯機】文本框中,輸入關鍵字【Apworks】,而後在程序包列表中選擇【Apworks】並單擊【安裝】按鈕:

image

在安裝時會提示許可協議對話框,單擊【我接受】按鈕便可。

而後,在EasyMemo.Domain上再新增一個AggregateRoot抽象類,使其實現Apworks中的IAggregateRoot接口:

using System;
using Apworks;

public abstract class AggregateRoot : IAggregateRoot
{
    public Guid ID { get; set; }
}

再新建一個Account類,使其繼承AggregateRoot類,它表示在EasyMemo整個應用程序中的「用戶帳戶」的概念,爲了從此的實現更爲方便快捷,Account類僅提供如下屬性:

/// <summary>
/// 表示EasyMemo中「用戶帳戶」的概念
/// </summary>
public class Account : AggregateRoot
{
    /// <summary>
    /// 獲取或設置帳戶名。
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    /// 獲取或設置帳戶密碼。
    /// </summary>
    public string Password { get; set; }

    /// <summary>
    /// 獲取或設置郵箱地址。
    /// </summary>
    public string Email { get; set; }

    /// <summary>
    /// 獲取或設置顯示名稱。
    /// </summary>
    public string DisplayName { get; set; }

    /// <summary>
    /// 獲取或設置帳戶建立日期。
    /// </summary>
    public DateTime DateCreated { get; set; }

    /// <summary>
    /// 獲取或設置最近一次登陸日期。
    /// </summary>
    public DateTime? DateLastLogon { get; set; }
}

編譯EasyMemo.Domain,編譯經過,表示咱們已經正常安裝並引用Apworks程序包了,能夠繼續對領域模型進行設計了。在下一講中,我將介紹EasyMemo領域模型的設計。

相關文章
相關標籤/搜索