在ASP.NET Core中使用Apworks快速开发数据服务
不少關(guān)注我博客的朋友都知道我在2009年左右開發(fā)過一個(gè)名為Apworks的企業(yè)級應(yīng)用程序開發(fā)框架,旨在為分布式企業(yè)系統(tǒng)軟件開發(fā)提供面向領(lǐng)域驅(qū)動(dòng)(DDD)的框架級別的解決方案,并對多種系統(tǒng)架構(gòu)風(fēng)格提供支持。這個(gè)框架的開發(fā)和維護(hù)我堅(jiān)持了很久,一直到2015年,我都一直在不停地重構(gòu)這個(gè)項(xiàng)目。目前這個(gè)項(xiàng)目在Github上也得到了將近260的推薦數(shù),很多對技術(shù)感興趣的朋友也一直與我保持著聯(lián)系和交流,甚至還有愛好者自發(fā)組成了技術(shù)討論群,專門討論分享Apworks框架。
然而,隨著軟件開發(fā)技術(shù)和.NET的發(fā)展,這個(gè)框架的設(shè)計(jì)和研發(fā)技術(shù)都逐漸過時(shí),重構(gòu)難度逐漸加大,很多由其本身支持的技術(shù),比如MSMQ、NHibernate也都逐漸淡出人們的視線,相比之下,云計(jì)算、微服務(wù)、大數(shù)據(jù)、跨平臺(tái)等相關(guān)技術(shù)越來越多地引起了業(yè)界的關(guān)注,成功的案例也越來越多。如何基于云平臺(tái)(PaaS + IaaS)快速搭建高效、經(jīng)濟(jì)、穩(wěn)定、安全的軟件系統(tǒng)架構(gòu),成為了最近兩年的熱門話題。微軟也順應(yīng)這樣的潮流,做出了很多的改變,就在短短的一到兩年時(shí)間,引領(lǐng)了.NET的跨平臺(tái),開源了諸多著名的項(xiàng)目,比如.NET、Core CLR、Roslyn、ASP.NET、Entity Framework、Powershell等等,并且開始接受并擁抱非Windows的操作系統(tǒng),比如Visual Studio跨平臺(tái)、Powershell跨平臺(tái)、SQL Server跨平臺(tái)、Visual C++支持多種編譯器等等。很明顯,原有的Apworks已經(jīng)不再具備跨平臺(tái)、云友好、開發(fā)迅速的特質(zhì),為此,我下定決心重寫了Apworks。
全新的Apworks Core應(yīng)用程序開發(fā)框架
新的Apworks Core也是開源項(xiàng)目,該項(xiàng)目依舊基于Apache 2.0許可協(xié)議,項(xiàng)目地址是:https://github.com/daxnet/apworks-core。目前仍然還在繼續(xù)開發(fā)階段,僅實(shí)現(xiàn)了原有DDD中的基本概念(實(shí)體、聚合、實(shí)體鍵、倉儲(chǔ)等),并針對內(nèi)存并發(fā)字典(Concurrent Dictionary)、MongoDB以及Entity Framework Core完成了三種不同的倉儲(chǔ)實(shí)現(xiàn),整個(gè)框架完全由.NET Core實(shí)現(xiàn)(目前提供net461和Net Standard 1.6兩種編譯),因此,可以使用在Windows的經(jīng)典.NET Framework下,也可以使用在Linux的.NET Core中。不僅如此,針對ASP.NET Core Web API,Apworks提供了相應(yīng)的整合與擴(kuò)展,使得數(shù)據(jù)服務(wù)的開發(fā)變得非常簡單方便,這也是本文準(zhǔn)備介紹的內(nèi)容,相信在閱讀本文之后,你將更多地了解到Apworks Core的開放性和擴(kuò)展性,并能體會(huì)到在.NET應(yīng)用程序的開發(fā)生態(tài)圈中,Apworks Core將會(huì)給你帶來更多的幫助。
演練:使用Apworks Core快速開發(fā)數(shù)據(jù)服務(wù)
在開始我們的Apworks Core開發(fā)演練之前,請先完成以下準(zhǔn)備工作:
安裝Visual Studio 2017,確保.NET Core和ASP.NET Core的開發(fā)功能已經(jīng)正確安裝
將https://www.myget.org/F/daxnet-apworks-pre/api/v3/index.json以及https://www.myget.org/F/daxnet-utils/api/v3/index.json兩個(gè)package source添加到NuGet的package source中:?
?
準(zhǔn)備一個(gè)MongoDB的數(shù)據(jù)庫服務(wù)器,建議直接下載Windows版本的搭建在本地機(jī)器,也可以在Linux下直接運(yùn)行mongo的Docker容器,省去了安裝MongoDB的步驟
如果希望能一起嘗試Visual Studio 2017的Docker功能,還需要確保安裝最新版本的Windows以及Docker for Windows。當(dāng)然,完成本文的演練并不需要Docker
開發(fā)步驟
首先,新建一個(gè)ASP.NET Core的應(yīng)用程序,名為CustomerService,通過Manage NuGet Packages添加對Apworks.Repositories.MongoDB以及Apworks.Integration.AspNetCore的引用。添加引用的時(shí)候注意選擇https://www.myget.org/F/daxnet-apworks-pre/api/v3/index.json這個(gè)package source:?
?
在CustomerService下新建一個(gè)Models目錄,添加兩個(gè)類,名稱分別為Address和Customer,代碼如下:?
| public? class? Address { ???? public? string? Country { get ; set ; } ???? public? string? State { get ; set ; } ???? public? string? City { get ; set ; } ???? public? string? Street { get ; set ; } ???? public? string? ZipCode { get ; set ; } } public? class? Customer : IAggregateRoot<Guid> { ???? public? Guid Id { get ; set ; } ???? public? string? Name { get ; set ; } ???? public? string? Email { get ; set ; } ???? public? Address ContactAddress { get ; set ; } } |
在Controllers子目錄下,新建一個(gè)Controller,取名為CustomersController,代碼如下:?
| public? class? CustomersController : DataServiceController<Guid, Customer> { ???? public? CustomersController(IRepositoryContext repositoryContext) : base (repositoryContext) ???? { ???? } } |
打開Startup.cs文件,在ConfigureServices方法中,加入以下代碼:?
| public? void? ConfigureServices(IServiceCollection services) { ???? // Add framework services. ???? services.AddMvc(); ???? services.AddApworks() ???????? .WithDataServiceSupport( new? DataServiceConfigurationOptions ???????????? ( new? MongoRepositoryContext ???????????????? ( new? MongoRepositorySettings( "localhost" , "customer-service" )))) ???????? .Configure(); } |
同樣在Startup.cs文件中,在Configure方法中,加入以下代碼:?
| public? void? Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { ???? loggerFactory.AddConsole(Configuration.GetSection( "Logging" )); ???? loggerFactory.AddDebug(); ???? app.EnrichDataServiceExceptionResponse(); ???? app.UseMvc(); } |
OK, you’re all set! 完成之后,解決方案資源管理器中的項(xiàng)目結(jié)構(gòu)如下,增加了一個(gè)Models目錄,以及一個(gè)CustomersController:?
編譯運(yùn)行
直接按下Ctrl + F5運(yùn)行站點(diǎn),站點(diǎn)起來后,你會(huì)發(fā)現(xiàn)瀏覽器打開的內(nèi)容跟標(biāo)準(zhǔn)的新建的ASP.NET Core Web API項(xiàng)目無異,顯示的是由ValuesController的GET方法返回的兩個(gè)字符串。不用著急,打開Fiddler,我們簡單測試一下剛剛新建的Customer數(shù)據(jù)服務(wù)(注意替換一下URL,我本地服務(wù)運(yùn)行在2238端口上):
POST?http://localhost:2238/api/customers?
?
POST操作成功返回HTTP 201,同時(shí)在Response Body中返回了新建的對象Id。?
GET?http://localhost:2238/api/customers?
限于篇幅,此處就不針對所有基本的HTTP操作一一進(jìn)行測試了。Apworks Data Service默認(rèn)支持以下HTTP方法,當(dāng)然,你可以隨意擴(kuò)展:
GET:獲取所有的對象,默認(rèn)支持服務(wù)端分頁,每頁15條記錄,可以通過http://localhost:2238/api/customers?page=aaa&size=bbb這樣的格式來指定每頁大小以及需要獲取的頁碼
GET {id}:http://localhost:2238/api/customers/{id}:獲取Id值為{id}的對象
POST {id}:替換Id值為{id}的對象,替換成功則返回HTTP 204(No Content)
PATCH {id}:更新id值為{id}的對象,Request Body需要符合Microsoft ASP.NET Json Patch的規(guī)范。更新成功返回HTTP 204(No Content)
DELETE {id}:刪除id值為{id}的對象。刪除成功返回HTTP 204(No Content)
幾個(gè)亮點(diǎn)
開發(fā)和配置過程及其簡單,如上所述,五個(gè)步驟完成一個(gè)數(shù)據(jù)對象的數(shù)據(jù)服務(wù)開發(fā)。流暢接口(Fluent API)配置方式,使得數(shù)據(jù)服務(wù)的開發(fā)過程與已有ASP.NET Core Web API的開發(fā)過程具有相同的開發(fā)者體驗(yàn)
HTTP GET調(diào)用默認(rèn)支持服務(wù)端分頁,分頁鏈接會(huì)通過HAL標(biāo)記體現(xiàn)在返回結(jié)果中
HTTP GET返回直接支持Hypertext Application Language(HAL,官方網(wǎng)站:http://stateless.co/hal_specification.html),返回Content-Type為application/hal+json。它是通過我的另一個(gè)開源項(xiàng)目https://github.com/daxnet/hal?實(shí)現(xiàn)的,HAL項(xiàng)目在.NET Core下完整、全面地實(shí)現(xiàn)了HAL規(guī)范,并且通過流暢接口(Fluent API)的方式,提供了較好的開發(fā)者體驗(yàn)。通過Apworks Core開發(fā)數(shù)據(jù)服務(wù)時(shí),開發(fā)者可以通過設(shè)定DataServiceConfigurationOptions參數(shù),選擇是否需要HAL支持,還可以擴(kuò)展HalBuildConfiguration類型,以實(shí)現(xiàn)HAL返回結(jié)果的自定義
倉儲(chǔ)實(shí)現(xiàn)可以選擇使用In-Memory Concurrent Dictionary、MongoDB以及Entity Framework Core,整個(gè)技術(shù)棧完全跨平臺(tái)。如果使用Entity Framework Core,目前EF Core對SQL Server、PostgreSQL以及SQLite的支持都不錯(cuò),對于Oracle等也有相應(yīng)的Provider支持,因此,可以選擇各種不同的關(guān)系型數(shù)據(jù)庫來基于Apworks Core快速實(shí)現(xiàn)數(shù)據(jù)服務(wù)
加入EnrichDataServiceExceptionResponse方法可以使得當(dāng)錯(cuò)誤發(fā)生時(shí),數(shù)據(jù)服務(wù)的返回結(jié)果將包含更為準(zhǔn)確的錯(cuò)誤代碼和錯(cuò)誤信息
對于三種目前支持的倉儲(chǔ)的使用方式、HAL返回結(jié)果自定義,以及數(shù)據(jù)服務(wù)的擴(kuò)展這些內(nèi)容,我今后再慢慢介紹吧,這里就不多說了。
總結(jié)
現(xiàn)在,Apworks Core僅僅是剛剛開始,接下來還有很長的路要走,單從數(shù)據(jù)服務(wù)和ASP.NET Core的整合這部分,還需要更加豐富的功能,比如API的幫助頁面、查詢條件和排序條件的指定等等。查詢條件的支持我打算使用我遷移的一個(gè)開源的.NET語法分析框架:Irony項(xiàng)目來完成。之后,我還是會(huì)像往常一樣,基于Apworks Core實(shí)現(xiàn)一個(gè)完整的應(yīng)用案例,來演示Apworks Core各方面的功能。
另一方面,Apworks Core的項(xiàng)目分支策略和持續(xù)集成也是可以拿來分享的。我沒有開放Apworks Core持續(xù)集成系統(tǒng),但任何人都可以通過項(xiàng)目的Github主頁了解到最新構(gòu)建的狀態(tài),也可以看到最新preview和release版本的package source。Apworks Core同時(shí)在Windows Server和Ubuntu Linux下完成編譯,編譯完全采用Powershell腳本完成,因此,對于Linux系統(tǒng),需要首先安裝Powershell。這些內(nèi)容我也會(huì)爭取抽空跟大家做介紹。
最后,還是那句話,大家多多交流,多提寶貴意見吧。我爭取做得更好。
原文地址:http://www.cnblogs.com/daxnet/p/6661369.html
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺(tái)或掃描二維碼關(guān)注
總結(jié)
以上是生活随笔為你收集整理的在ASP.NET Core中使用Apworks快速开发数据服务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET Core开源组件:后台任务利器
- 下一篇: asp.net ajax控件工具集 Au