架构系列:ASP.NET 项目结构搭建
我們頭開(kāi)始,從簡(jiǎn)單的單項(xiàng)目解決方案,逐步添加業(yè)務(wù)邏輯的約束,從應(yīng)用邏輯和領(lǐng)域邏輯兩方面考慮,從簡(jiǎn)單的單個(gè)項(xiàng)目逐步搭建一個(gè)多項(xiàng)目的解決方案。主要內(nèi)容:
(1)搭建應(yīng)用邏輯和領(lǐng)域邏輯都簡(jiǎn)單的單項(xiàng)目
(2)為應(yīng)用邏輯復(fù)雜的單項(xiàng)目添加應(yīng)用服務(wù)
(3)為領(lǐng)域邏輯復(fù)雜的單項(xiàng)目添加領(lǐng)域行為
(4)Application膨脹時(shí),分離Application項(xiàng)目
(5)分離Infrastructure項(xiàng)目
(6)添加Web服務(wù)支持
(7)Web服務(wù)器負(fù)載均衡的支持
(8)其他方面的擴(kuò)展支持
1.搭建應(yīng)用邏輯和領(lǐng)域邏輯都簡(jiǎn)單的單項(xiàng)目
業(yè)務(wù)邏輯簡(jiǎn)單,主要的用例和CURD幾乎一一對(duì)應(yīng),沒(méi)有區(qū)分應(yīng)用邏輯和領(lǐng)域邏輯的必要。
(1)搭建單項(xiàng)目解決方案:Example,項(xiàng)目類(lèi)型為ASP.NET MVC
(2)添加Application文件夾,添加IRepository<T>接口。
(3)在Application文件夾中添加Domain文件夾,使用POCO作為實(shí)體。
(3)添加Infrastructure文件夾,添加Dependency文件夾,添加IContainer和IoCContainer實(shí)現(xiàn),添加Repository文件夾和EfRepository<T>實(shí)現(xiàn)。
(4)添加Web文件夾,添加IoCControllerFactory實(shí)現(xiàn),在Controller中通過(guò)構(gòu)造注入IRespository<T>。
2.為應(yīng)用邏輯復(fù)雜的單項(xiàng)目添加應(yīng)用服務(wù)
業(yè)務(wù)邏輯復(fù)雜的原因更多體現(xiàn)在流程控制上而非領(lǐng)域邏輯上,因此我們對(duì)上文的項(xiàng)目進(jìn)行改造。
(1)Application文件夾中添加Service文件夾,通過(guò)ApplicationService接口來(lái)抽象應(yīng)用邏輯,在實(shí)現(xiàn)ApplicationService接口時(shí)通過(guò)構(gòu)造注入IRepository<T>。
(2)在Controller不在直接依賴(lài)IRepository,在Controller中通過(guò)構(gòu)造注入IApplicationService。
3.為領(lǐng)域邏輯復(fù)雜的單項(xiàng)目添加領(lǐng)域行為
領(lǐng)域邏輯復(fù)雜表現(xiàn)在過(guò)多的直接通過(guò)屬性進(jìn)行實(shí)體狀態(tài)判斷并多次賦值,一般情況下這些代碼可以通過(guò)重構(gòu)添加到實(shí)體。
(1)從ApplicationService中分離出與流程控制無(wú)關(guān)的代碼。
(2)對(duì)實(shí)體類(lèi)添加行為,實(shí)體類(lèi)的public方法的定義分離到實(shí)體接口中,其他方法為私有方法。
此時(shí)的項(xiàng)目結(jié)構(gòu)如圖所示:
4.Application膨脹時(shí),分離Application項(xiàng)目
Application是項(xiàng)目的核心,本身都是業(yè)務(wù)邏輯相關(guān)的代碼,即使對(duì)其他類(lèi)庫(kù)有依賴(lài)也可以通過(guò)接口隔離方式消除,因此在Application代碼膨脹時(shí),無(wú)論是應(yīng)用邏輯和領(lǐng)域邏輯哪種原因,都應(yīng)該分離Application項(xiàng)目,更重要的意義在于我們需要對(duì)Application項(xiàng)目進(jìn)行單元測(cè)試。事實(shí)上復(fù)雜一些的項(xiàng)目,我們一開(kāi)始構(gòu)建的就是Application項(xiàng)目及其單元測(cè)試。
(1)在解決方案中添加Example.Application項(xiàng)目。
(2)將Example項(xiàng)目中的Application文件夾下的全部文件遷移到Example.Application項(xiàng)目中,這樣無(wú)需修改命名空間。
(3)修改Example項(xiàng)目添加Example.Application項(xiàng)目的引用。
此時(shí)解決方案的結(jié)構(gòu)如圖所示:
5.分離Infrastructure項(xiàng)目
分離Application項(xiàng)目后,由于Infrastructure只單向依賴(lài)Application中的接口,因此分離Infrastructure項(xiàng)目順理成章。如果是多客戶(hù)端項(xiàng)目,在分離Infrastructure后可以考慮再?gòu)腤eb項(xiàng)目中分離出單獨(dú)表現(xiàn)邏輯層Example.WebBase。
(1)在解決方案中添加Example.Infrastructure項(xiàng)目。
(2)將Example項(xiàng)目中的Infrastructure文件夾下的全部文件遷移到Example.Infrastructure項(xiàng)目中,同樣無(wú)需修改命名空間。
(3)修改項(xiàng)目的引用,添加Example對(duì)Example.Infrastructure項(xiàng)目的引用,添加Example.Infrastructure對(duì)Example.Application的引用。
此時(shí)解決方案結(jié)構(gòu)如圖所示:
6.添加Web服務(wù)支持
由于Web項(xiàng)目只依賴(lài)ApplicationService的接口,這是應(yīng)有之意。我們添加服務(wù)層時(shí)只需要提供Web服務(wù)類(lèi)型的IApplicationService接口實(shí)現(xiàn)即可。
(1)添加Example.Application.WebApi項(xiàng)目,引用Example.Application項(xiàng)目,封裝ApplicationService應(yīng)用服務(wù)。
(2)添加Example.WebApiApplicationService項(xiàng)目,引用Example.Application和Example.Application.WebApi項(xiàng)目,實(shí)現(xiàn)IApplicationService接口的WebApi版本W(wǎng)ebApiApplicationService。
(3)修改Example項(xiàng)目的依賴(lài)注入配置,將IApplicationService的實(shí)現(xiàn)配置為WebApiApplicationService。
(4)還要記得將Web項(xiàng)目中配置的ApplicationService的第三方依賴(lài)接口的依賴(lài)注入配置轉(zhuǎn)移到Web服務(wù)項(xiàng)目中。
此時(shí)解決方案如圖所示:
7.Web服務(wù)器負(fù)載均衡的支持
添加Web服務(wù)器的負(fù)載均衡主要解決認(rèn)證token的問(wèn)題和Session的問(wèn)題。
(1)ASP.NET的Forms認(rèn)證可以通過(guò)修改Web.config支持生成同樣的用戶(hù)token。
(2)ASP.NET的Session可以通過(guò)自定義SessionStateStoreProviderBase實(shí)現(xiàn)分離Session到Session狀態(tài)服務(wù)器或集群。
8.其他方面的擴(kuò)展支持
無(wú)論是郵件服務(wù)、緩存還是數(shù)據(jù)庫(kù),Application都是通過(guò)接口隔離了具體的實(shí)現(xiàn),因此我們可以按需添加ApplicationService中定義的IEmail、ICache、ILogger等的其他實(shí)現(xiàn),再修改依賴(lài)注入的配置即可。如果沒(méi)有采用Web服務(wù),修改Web項(xiàng)目,否則修改Web服務(wù)項(xiàng)目的依賴(lài)注入配置。
總結(jié)
以上是生活随笔為你收集整理的架构系列:ASP.NET 项目结构搭建的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 芒果知识补充(1)mongodb 单机的
- 下一篇: 新快现消费凭证审核未通过怎么办?找准原因