从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。