从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 Controller factory,这样您的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服务示例
- 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 POST的变量收集用户输入,并调用纯/可测C#逻辑,然后准备响应,在ServiceStack中,将填充Response DTO,而对于MVC Controller,您将填充viewmodel。
从MVC控制器调用ServiceStack服务
虽然我将通过上面的C#greet服务来控制器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。