ServiceStack 應該是 MVC 應用程序中的服務層還是應該呼叫服務層?
我正在創建一個 MVC 網站,還打算創建一個 Web API,供網站內部使用,也可能供第三方使用。
我將從 MVC 控制器呼叫服務層,該服務層將包含業務邏輯、對域模型進行操作、執行驗證、進行基礎設施外部服務呼叫等。服務層反過來將呼叫儲存庫以進行任何數據庫互動。
現在,我喜歡ServiceStack的外觀並打算將它用於 Web API - 它似乎比ASP.NET MVC 4 Web API更成熟。我的問題是,我應該將 ServiceStack API 呼叫到上面的服務層,類似於 MVC 控制器,還是應該將其作為服務層,同時為 Web 客戶端和 MVC 控制器提供服務?
我都不會。
理想情況下,MVC 和 ServiceStack 都應該使用和共享純 C# 依賴項。一個 MVC + ServiceStack 網站和諧共處的好例子是SocialBootstrapApi展示項目,該項目已部署在 AppHarbor 上:http ://bootstrapapi.apphb.com
我將在您的 ServiceStack AppHost 中註冊您的所有依賴項,然後註冊一個MVC 控制器工廠,以便您的 MVC 控制器和 ServiceStack 服務都與這些依賴項自動連接。
在您的 AppHost 中:
void Configure(Funq.Container container) { container.Register<IGreeter>(c => new Greeter()); //Set MVC to use the same Funq IOC as ServiceStack ControllerBuilder.Current.SetControllerFactory( new FunqControllerFactory(container)); }使用 ServiceStack 服務的範例
IGreeterpublic class HelloService : Service { public IGreeter Greeter { get; set; } //Autowired public HelloResponse Get(Hello request) { return new HelloResponse { Result = Greeter.SayHelloTo(request.Name) }; } }使用相同 IGreeter 的 MVC 控制器範例:
public HelloController : ServiceStackController { public IGreeter Greeter { get; set; } //Autowired public void Index(string name) { ViewBag.GreetResult = Greeter.SayHelloTo(name); return View(); } }總體構想是 MVC 控制器內部的邏輯,ServiceStack 服務應該關注 HTTP 層/集成點,即從 QueryString 或 FORM POST 變數中收集使用者輸入,並用它呼叫純/可測試的 C# 邏輯,然後準備響應,在 ServiceStack 中將填充響應 DTO,而對於 MVC 控制器,您將填充 ViewModel。
從 MVC 控制器呼叫 ServiceStack 服務
雖然我會通過上面的 C# greet 服務獲得 Controllers + ServiceStack 共享功能,但您也可以從 MVC 控制器呼叫 ServiceStack 服務,例如:
public HelloController : ServiceStackController { public void Index(string name) { using (var helloService = AppHostBase.ResolveService<HelloService>()) { ViewBag.GreetResult = helloService.Get(name).Result; return View(); } } }與 ServiceStackController 共享會話/記憶體
儘管 MVC 控制器範例繼承自ServiceStackController,但這不是必需的,但允許您在 MVC 和 ServiceStack 中共享相同的 Session / Caching / Authentication + RequiredRole/RequiredPermission 屬性。
有關ServiceStack 為 MVC 帶來的其他好處,請參閱MVC PowerPack 。