創(chuàng)建你的第一個(gè)WebService
這是一個(gè)關(guān)于構(gòu)建并允許并同時(shí)看一看不同組件是如何工作的快速預(yù)覽妓雾。
第一步:下載并安裝ServiceStackVS插件
第一我們希望安裝ServiceStackVS的visual studio的擴(kuò)展多矮。最簡(jiǎn)單的方式是通過內(nèi)置在Visual Studio-【工具】-【擴(kuò)展和更新】...進(jìn)行搜索和安裝
第二步:選擇模板
當(dāng)ServiceStackVs擴(kuò)展已經(jīng)安裝付燥,當(dāng)你創(chuàng)建新的項(xiàng)目時(shí)你就有新的項(xiàng)目模板可以使用躺孝,例如,讓我們選擇ServiceStack ASP.NET Empty來開始餐弱。
但你通過模板來創(chuàng)建你的應(yīng)用番挺,你就會(huì)得到4個(gè)項(xiàng)目在你的解決方案中,如果你使用的是默認(rèn)名字酗钞,你就會(huì)以下面的結(jié)構(gòu)構(gòu)建這個(gè)解決方案腹忽。
第三步:
通過F5運(yùn)行你的項(xiàng)目
運(yùn)行結(jié)果(postman):
它是如何運(yùn)行的来累?
現(xiàn)在新項(xiàng)目已經(jīng)運(yùn)行,讓我們來看看我們已經(jīng)有了哪些內(nèi)容窘奏。模板提供了一個(gè)單獨(dú)的Web服務(wù)路由嘹锁,該路由位于WebApplication1.ServiceModel項(xiàng)目下的Hello.cs文件里的請(qǐng)求DTO(數(shù)據(jù)傳輸對(duì)象)的對(duì)象。
[Route("/hello/{Name}")]
public class Hello : IReturn<HelloResponse>
{
public string Name { get; set; }
}
public class HelloResponse
{
public string Result { get; set; }
}
這個(gè)Route
特性說明路徑/hello/{Name}
中{Name}
將它的值綁定到了公開的Name的字符串屬性上
讓我們通過這個(gè)路由來看下它的返回着裹,通過如下人URL到你的地址欄
http://{BaseUrl}/hello/world
你可能看到一個(gè)HTML的返回格式的內(nèi)容领猾。將返回格式化為Json,只需要加?format=json
到URL的末尾骇扇,
如何你到解決方案中去找WebApplication1.ServiceInterface并且打開Myservice.cs
文件摔竿,你就可以看到響應(yīng)到瀏覽器的代碼。給我們Result
的返回
public class MyServices : Service
{
public object Any(Hello request)
{
return new HelloResponse { Result = $"Hello, {request.Name}!" };
}
}
如何你看上面代碼少孝,必須注意一些事情继低。方法名Any
意味著方法運(yùn)行在任何可能的Http Verbs上,服務(wù)方法就是你控制從你的服務(wù)中返回內(nèi)容的地方稍走。
第四步:探索這個(gè)ServiceStack的解決方案
下面推薦的結(jié)構(gòu)是構(gòu)建進(jìn)了所有的ServiceStack VS.NET的模板中袁翁,模板創(chuàng)建任何一個(gè)ServiceStack項(xiàng)目至少包含四個(gè)項(xiàng)目來保證解決方案從一開始就是最佳邏輯項(xiàng)目層次,并為后續(xù)項(xiàng)目的可維護(hù)性婿脸,高內(nèi)聚粱胜,可復(fù)用打下基礎(chǔ)。
Host Project
這個(gè)主項(xiàng)目包含你的AppHost,它引用和注冊(cè)在IOC中的所有依賴項(xiàng)狐树,并且包含了所有配置項(xiàng)和全局行為的中心位置焙压。它也引用了所有的Web資源,例如razor Views,JS,CSS,Images,Fonts等抑钟。這需要同應(yīng)用一起部署涯曲。AppHost是一個(gè)頂層項(xiàng)目,他引用了應(yīng)用程序鎖使用的所有依賴項(xiàng)在塔,它的作用類似于一個(gè)協(xié)調(diào)器和管道掀抹,它決定了那些功能可用,那些具體實(shí)現(xiàn)被使用心俗。被設(shè)計(jì)為引用所有項(xiàng)目同時(shí)不被其他項(xiàng)目引用傲武,作為一個(gè)全局目標(biāo),應(yīng)該避免任何應(yīng)用和業(yè)務(wù)邏輯城榛。
ServiceInterface Project
服務(wù)接口項(xiàng)目時(shí)包含了所有業(yè)務(wù)邏輯和服務(wù)的實(shí)現(xiàn)項(xiàng)目揪利。它引用了除Host Project的所有項(xiàng)目,中小型項(xiàng)目可以通過邏輯劃分特性文件夾來包含所有的實(shí)現(xiàn)狠持。大型解決方案可以劃分未更加內(nèi)聚的模塊項(xiàng)目疟位,同時(shí)我們建議封裝他們可能使用的所有依賴。
ServiceModel Project
ServiceModel 項(xiàng)目包含所有的你的程序的數(shù)據(jù)傳輸對(duì)象喘垂,這些對(duì)象定義了你的服務(wù)契約甜刻。keeping them isolated from any Server implementation is how your Service is able to encapsulate its capabilities and make them available behind a remote facade.對(duì)于每一個(gè)解決方案最好只有一個(gè)包含你所有DTOs的ServiceModel項(xiàng)目绍撞。作為實(shí)現(xiàn)項(xiàng),依賴項(xiàng)得院,無邏輯的服務(wù)契約傻铣,從實(shí)現(xiàn)和相互依賴來確保你的服務(wù)不會(huì)包含特定的客戶端實(shí)現(xiàn),并且確保這是唯一需要客戶端通過直接引用ServiceModel.dll或者通過添加ServiceStack引用遠(yuǎn)程ServiceStack服務(wù)實(shí)例下載Dtos的來調(diào)用你的服務(wù)的項(xiàng)目祥绞。