我們頭開始,從簡單的單專案解決方案,逐步新增業務邏輯的約束,從應用邏輯和領域邏輯兩方面考慮,從簡單的單個專案逐步搭建一個多專案的解決方案。主要內容:
(1)搭建應用邏輯和領域邏輯都簡單的單專案
(2)為應用邏輯複雜的單專案新增應用服務
(3)為領域邏輯複雜的單專案新增領域行為
(4)Application膨脹時,分離Application專案
(5)分離Infrastructure專案
(6)新增Web服務支援
(7)Web伺服器負載均衡的支援
(8)其他方面的擴充套件支援
1.搭建應用邏輯和領域邏輯都簡單的單專案
業務邏輯簡單,主要的用例和CURD幾乎一一對應,沒有區分應用邏輯和領域邏輯的必要。
(1)搭建單專案解決方案:Example,專案型別為ASP.NET MVC
(2)新增Application資料夾,新增IRepository<T>介面。
(3)在Application資料夾中新增Domain資料夾,使用POCO作為實體。
(3)新增Infrastructure資料夾,新增Dependency資料夾,新增IContainer和IoCContainer實現,新增Repository資料夾和EfRepository<T>實現。
(4)新增Web資料夾,新增IoCControllerFactory實現,在Controller中通過構造注入IRespository<T>。
2.為應用邏輯複雜的單專案新增應用服務
業務邏輯複雜的原因更多體現在流程控制上而非領域邏輯上,因此我們對上文的專案進行改造。
(1)Application資料夾中新增Service資料夾,通過ApplicationService介面來抽象應用邏輯,在實現ApplicationService介面時通過構造注入IRepository<T>。
(2)在Controller不在直接依賴IRepository,在Controller中通過構造注入IApplicationService。
3.為領域邏輯複雜的單專案新增領域行為
領域邏輯複雜表現在過多的直接通過屬性進行實體狀態判斷並多次賦值,一般情況下這些程式碼可以通過重構新增到實體。
(1)從ApplicationService中分離出與流程控制無關的程式碼。
(2)對實體類新增行為,實體類的public方法的定義分離到實體介面中,其他方法為私有方法。
此時的專案結構如圖所示:
4.Application膨脹時,分離Application專案
Application是專案的核心,本身都是業務邏輯相關的程式碼,即使對其他類庫有依賴也可以通過介面隔離方式消除,因此在Application程式碼膨脹時,無論是應用邏輯和領域邏輯哪種原因,都應該分離Application專案,更重要的意義在於我們需要對Application專案進行單元測試。事實上覆雜一些的專案,我們一開始構建的就是Application專案及其單元測試。
(1)在解決方案中新增Example.Application專案。
(2)將Example專案中的Application資料夾下的全部檔案遷移到Example.Application專案中,這樣無需修改名稱空間。
(3)修改Example專案新增Example.Application專案的引用。
此時解決方案的結構如圖所示:
5.分離Infrastructure專案
分離Application專案後,由於Infrastructure只單向依賴Application中的介面,因此分離Infrastructure專案順理成章。如果是多客戶端專案,在分離Infrastructure後可以考慮再從Web專案中分離出單獨表現邏輯層Example.WebBase。
(1)在解決方案中新增Example.Infrastructure專案。
(2)將Example專案中的Infrastructure資料夾下的全部檔案遷移到Example.Infrastructure專案中,同樣無需修改名稱空間。
(3)修改專案的引用,新增Example對Example.Infrastructure專案的引用,新增Example.Infrastructure對Example.Application的引用。
此時解決方案結構如圖所示:
6.新增Web服務支援
由於Web專案只依賴ApplicationService的介面,這是應有之意。我們新增服務層時只需要提供Web服務型別的IApplicationService介面實現即可。
(1)新增Example.Application.WebApi專案,引用Example.Application專案,封裝ApplicationService應用服務。
(2)新增Example.WebApiApplicationService專案,引用Example.Application和Example.Application.WebApi專案,實現IApplicationService介面的WebApi版本WebApiApplicationService。
(3)修改Example專案的依賴注入配置,將IApplicationService的實現配置為WebApiApplicationService。
(4)還要記得將Web專案中配置的ApplicationService的第三方依賴介面的依賴注入配置轉移到Web服務專案中。
此時解決方案如圖所示:
7.Web伺服器負載均衡的支援
新增Web伺服器的負載均衡主要解決認證token的問題和Session的問題。
(1)ASP.NET的Forms認證可以通過修改Web.config支援生成同樣的使用者token。
(2)ASP.NET的Session可以通過自定義SessionStateStoreProviderBase實現分離Session到Session狀態伺服器或叢集。
8.其他方面的擴充套件支援
無論是郵件服務、快取還是資料庫,Application都是通過介面隔離了具體的實現,因此我們可以按需新增ApplicationService中定義的IEmail、ICache、ILogger等的其他實現,再修改依賴注入的配置即可。如果沒有采用Web服務,修改Web專案,否則修改Web服務專案的依賴注入配置。