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

时间:2012-05-13 11:46:30

标签: asp.net-mvc asp.net-web-api servicestack service-layer

我正在创建一个MVC网站,并打算创建一个Web API,以便在网站内使用,也可能由第三方使用。

从MVC控制器我将调用一个服务层,该服务层将包含业务逻辑,作用于域模型,执行验证,进行基础架构外部服务调用等。服务层反过来将调用存储库以进行任何数据库交互。

现在,我喜欢ServiceStack的外观并打算将其用于Web API - 它似乎比ASP.NET MVC 4 Web API更成熟。我的问题是,我应该在上面的服务层中调用ServiceStack API,类似于MVC控制器,还是应该将其作为服务层,为Web客户端和MVC控制器提供服务?

1 个答案:

答案 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

的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控制器,你将填充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 Controller示例继承自ServiceStackController,但它不是必需的,但允许您在MVC和ServiceStack中共享相同的Session / Caching / Authentication + RequiredRole / RequiredPermission属性。

有关ServiceStack为MVC带来的其他好处,请参阅MVC PowerPack