ServiceStack应该是MVC应用程序中的服务层还是应该调用服务层?

我正在创build一个MVC网站,并打算创build一个Web API,以便在网站内部和第三方使用。

从MVC控制器中,我将调用一个服务层,它将包含业务逻辑,在域模型上运行,执行validation,进行基础设施外部服务调用等。服务层反过来将调用存储库以进行任何数据库交互。

现在,我喜欢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)); } 

使用IGreeter的ServiceStack服务IGreeter

 public 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 POSTvariables的用户input,并调用纯的/可testing的C#逻辑,然后准备响应,在ServiceStack中将填充Response DTO,而对于MVC控制器,则将填充ViewModel。

从MVC控制器调用ServiceStack服务

虽然我将通过上面的C#问候服务控制器+ ServiceStack共享function,但您也可以从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共享会话/caching

尽pipeMVC控制器的例子是从ServiceStackControllerinheritance而来的,但这并不是必须的,但它允许您在MVC和ServiceStack中共享相同的Session / Caching / Authentication + RequiredRole / RequiredPermission属性。

请参阅MVC PowerPack以了解ServiceStack为MVC带来的其他好处。