我正在创建一个MVC网站,并打算创建一个Web API,以便在网站内使用,也可能由第三方使用。
从MVC控制器我将调用一个服务层,该服务层将包含业务逻辑,作用于域模型,执行验证,进行基础架构外部服务调用等。服务层反过来将调用存储库以进行任何数据库交互。
现在,我喜欢ServiceStack的外观并打算将其用于Web API - 它似乎比ASP.NET MVC 4 Web API更成熟。我的问题是,我应该在上面的服务层中调用ServiceStack API,类似于MVC控制器,还是应该将其作为服务层,为Web客户端和MVC控制器提供服务?
答案 0 :(得分:37)
我不会这样做。
理想情况下,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
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控制器,你将填充ViewModel。
虽然我可以通过上面的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();
}
}
}
虽然MVC Controller示例继承自ServiceStackController,但它不是必需的,但允许您在MVC和ServiceStack中共享相同的Session / Caching / Authentication + RequiredRole / RequiredPermission属性。
有关ServiceStack为MVC带来的其他好处,请参阅MVC PowerPack。