2015年4月23日 星期四

ASP.NET MVC 專案分層架構 - twMVC#18

距離「ASP.NET MVC 專案分層架構」系列的第六篇到現在已經有兩年都沒有再開新篇,本來應該是要接著再寫第七篇,起初是因為沒有時間而一直延宕,但後來開始覺得我不曉得要如何寫接下來的內容,以致於這兩年多來都沒有任何的動作,一直到了今年 twMVC 的第一場研討會,才藉著這個機會將這個系列從第一篇到第七篇(只限定在研討會的 Part.7)給做個整理與說明。

 


先將「ASP.NET MVC 專案分層架構」分類的文章給列出來

ASP.NET MVC 專案分層架構 Part.1 - 初學者的起手式
ASP.NET MVC 專案分層架構 Part.2 - 抽出 Repository 裡的相同部分
ASP.NET MVC 專案分層架構 Part.3 - 個別 Repository 的資料存取與操作
ASP.NET MVC 專案分層架構 Part.4 - 抽出 Model 層並建立為類別庫專案
ASP.NET MVC 專案分層架構 Part.5 - 建立 Service 層
ASP.NET MVC 專案分層架構 Part.6 - DI/IoC 使用 Unity.MVC
ASP.NET MVC 專案分層架構 - 建議與補充
錯誤更正:有關 ASP.NET MVC 分層架構使用 Unity 的 DbContext 處理

從 2012-10-22 一直到 2013-08-15 的這段期間總共寫了八篇的系列文章,其中的 Part.1 ~ Part.4 是連貫的內容,然後 Part.5 與 Part.6 則為不同主題的接續,最後兩篇則為補充說明與錯誤內容的更正。

 

twMVC#18

我在 twMVC#18 裡整理了這一系列的內容,並且把預計要寫出來但是卻遲遲沒有實行的「Part.7 - Unit of Work 工作單元」在研討會裡做了說明,在研討會裡也宣布了我不會將這第七篇文章給寫出來,所以部落格文章只有 Part.1 ~ Part.6 的文章,而 Part.7 則是只有在研討會限定,雖然說不會寫以及只有在研討討會裡限定,但是簡報檔以及範例專案檔還是有提供給大家。

簡報
http://www.slideshare.net/demofan/tw-mvc18-kevintseng

 

範例專案檔 @ Github
https://github.com/twMVC/twMVC-18-1

image

 

動機

一開始寫出這系列的文章是聽了 twMVC#5「ASP.NET MVC 之實戰架構探討」由 twMVC 核心講師 Bibby Chung 所分享的主題,在聽過 Bibby 的分享之後,就有了寫出這系列文章的動機,一開始的動機其實很單純,就是想要分享自己在專案裡所使用的分層架構,從一個沒有任何分層的專案開始然後逐步去拆解各個部分去做出一個基本的三層式的專案架構。

 

提醒和警語

大概因為 Part.1 ~ Part.4 內容比較淺顯,所以就有相當多人看、也跟著做,但是從文章的問答內容開始發現到,有很多人對於這個系列是濛濛懂懂的,對於已經是程式開發的老油條來說,這個系列對他們來說是理所當然也輕而易舉,而且對他們而言,他們對於分層是有不同的見解與實作,但是對於程式開發的菜鳥或是沒有物件導向、沒有分層概念的人來說,這個系列就有如天書一般。

尤其是程式開發的初學者,因為常常聽到周遭的人或是網路上的討論都會說到分層,所以也想嘗試在自己的專案裡做分層,但是在沒有人教也無法理解網路上文章內容的情況下,看到了這系列文章就躍躍欲試,但是在缺乏觀念以及沒有多少專案開發經驗的情況下,跟著文章照著做,有很多地方就產生了疑問,甚至於誤解了內容,以致於發生了很多連我也無法理解的狀況,這些都是從很多網友直接 Email 給我他們的專案裡所看到的。

於是我覺得這樣不行,對於初學者甚至於是寫程式好多年但是沒有觀念的開發者來說,這系列的文章是完全不適合他們,於是我就加上了很多的警語,為的就是提醒他們,這系列的文章可以看看,但是在他們還沒有建立觀念的情況下並不適合直接拿到專案裡應用。

image

image

但是這些提醒和警語就好像宣導「喝酒不開車、開車不喝酒」一樣,對於很多人是視而不見的,其中有一部份的原因在於,很多開發者不認為自己是初學者,一部份的開發者覺得開發多年而自認為有相當的觀念與概念,而另一部分的人則是開發多年卻是連物件導向的觀念是一點也沒有,這樣的情況下去看這些文章,也只是會害了你們而已。

 

發現

這兩年多來在做專案的時候,會接觸到很多公司,當對方知道我是這個部落格以及這個系列的作者後,有時會聽到對方說他們公司的專案架構就是採用這系列文章的做法,當聽到一個公司或一個開發團隊會這樣跟我說的時候,一開始是讓我覺得有點虛榮,但是當越來越多的團隊是這樣跟我說的時候,就開始有種莫名的恐懼,因為這些團隊並沒有實作完全,有的團隊只做到 Par.1 ~ Part.4,有的團隊全做了,但沒有做介面也沒有使用 DI,因為他們覺得沒有必要到,而且這系列的最後也是最重要的部分「Unit of Work」是沒有寫出來的,在這樣的情況下,除非這些團隊發現到那最後一步沒有實作的部分而自行再去研究,不然都會有很多的問題產生。

我所寫的這個系列的實作也不是唯一的實作方式,有關分層的做法與見解是有相當多種,在網路上可以找到許多相關的文章,另外在 CodePlex 以及 Github 上面也是有很多開放原始碼的專案讓我們參考,所以可以藉由這些文章與原始碼的內容去瞭解以及分析、歸納,然後理出自己的想法,並且去訂出符合一般認知和符合自己想法、適合專案應用的一個架構,當然在實作的過程中並非一蹴即成,可能最初幾次的實作會發現到很多問題,專案成員提出各種的反應與回饋,藉由一次一次的不斷實作、推翻去慢慢堆砌、塑型、修改,最後就會摸索出適合專案的架構,但是要注意喔,並不是每一個專案都是適合你所做出來的架構,而是應該要依照每一個專案的使用情境與應用範圍的不同而去做調整,就像 APP 的應用與 WebSite 的應用,兩者的系統架構就應該有所不同與區隔。

 


這一篇主要是說明 twMVC#18 的內容,然後一開始也提到原本應該要寫卻一直遲遲沒寫出來的第七篇 Unit of Work 確定不會寫出來了,希望大家可以從簡報的內容和原始碼的程式裡去做瞭解, 如果真的無法理解為何要使用這樣的模式或是也不知道如何應用到專案的話,那麼就表示時機還沒到,你可以先放下,還不必實作到這一個階段。

在「ASP.NET MVC 專案分層架構 - 建議與補充」這一篇文章裡也提到過,如果想要依循我這一系列文章的方式去實作架構,並不是一定要第一篇到第七篇看完之後,要完完全全地去把所有的變化與內容給如實地做出來,而是可以一個階段一個階段的去逐步實現,例如你想要做一個專案並採用分層的方式去開發,可以第一個專案先行採用第一篇起手式的做法,之後的幾個專案都採用起手式裡面的做法去實作,等到熟練並且也知道為何要這麼做之後,下一個專案就再往第二篇的做法去實作,之後的專案都是照著這樣的循環下去,如此一來就可以將全部的內容給連貫起來了。

所以切記,初學者或是初階開發者、不瞭解物件導向的開發者,真的不建議看這一系列的文章,要參考這一系列的做法去開發專案時,也不需要全部看過之後再一次把全部的東西給實作完全,而是要按部就班地一個階段一個階段去逐步實作,千萬不要囫圇吞棗。

因為這一篇是把 twMVC#18 的簡報與 for 研討會範例專案原始碼給分享出來,下一篇會再把原本這一系列文章的最後實作給提供出來,用了三種 DI Container 去實作不同的 Unit of Work 架構,不要以為我沒有寫出第七篇是我根本沒有做出東西所以才沒有寫文,我必須要說兩年前就已經把程式都給實作完成了,只是不知道如何下筆去把文章給寫出來,寫出來也還算小事,真正的問題是在怎麼寫才能讓大家能夠明白與瞭解,不過後來看了大家對於我所寫的第一篇到第六篇的反應之後就徹底覺悟了(請原諒我的文筆,讓大家無法透過我的文章讓大家可以理解)。

image

 

以上

7 則留言:

  1. 好不容易翻墙看完了您 part 1 — part 6 的文章,感觉受益匪浅,十分感谢您!

    回覆刪除
    回覆
    1. 感謝你的回應,還有很多不足的地方,還請多指教。

      刪除
  2. 請問在「相關書籍」中的「企業應用架構模式」,2015年重印新版,新版可以在哪買到呢?

    回覆刪除
    回覆
    1. 這必須請你去 Goole 喔
      雖然這樣回答你會蠻殘酷的,但是我當初也是這樣去找的,最後是在露天拍賣網站上買的,
      這邊我不指定那一個賣家,因為對我來說都差不多,所以我就找其中一家去買這一本書,
      買簡體書,如果可以的話,找個時間找一趟台北的天瓏書局或是三民書局,
      不然也可以直接到三民書局的網站去找,透過三民書局買書,如果有現貨是可以一週內收到書,
      但大部分都還需要下單後由三民書局去訂購,就會需要等一段時間,數週到幾個月不等,
      我最常等待的時間是三個多月,去年 11 月初下單,一直等到今年農曆春節後才收到書。
      就... Google 吧

      刪除
    2. 天瓏書局網站
      http://www.tenlong.com.tw/items/7111303938?item_id=999226

      刪除
  3. 因為天瓏、三民我都找過~只是因為出版日期都是2010年,所以想說跟你確認一下,謝謝你的回覆~

    回覆刪除
    回覆
    1. 現在看到的紅皮書版本,如果買的是新書,應該都會是 2015 年重印版本,
      http://goods.ruten.com.tw/item/show?21202192253931

      刪除

提醒

千萬不要使用 Google Talk (Hangouts) 或 Facebook 及時通訊與我聯繫、提問,因為會掉訊息甚至我是過了好幾天之後才發現到你曾經傳給我訊息過,請多多使用「詢問與建議」(在左邊,就在左邊),另外比較深入的問題討論,或是有牽涉到你實作程式碼的內容,不適合在留言板裡留言討論,請務必使用「詢問與建議」功能(可以夾帶檔案),謝謝。