23

我正在创建一个 MVC 网站,还打算创建一个 Web API,供网站内部使用,也可能供第三方使用。

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

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

4

1 回答 1

37

我都不会。

理想情况下,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));
}

使用 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 POST 变量中收集用户输入,并用它调用纯/可测试的 C# 逻辑,然后准备响应,在 ServiceStack 中将填充响应 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 控制器示例继承自ServiceStackController,但这不是必需的,但允许您在 MVC 和 ServiceStack 中共享相同的 Session / Caching / Authentication + RequiredRole/RequiredPermission 属性。

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

于 2012-05-13T15:35:14.493 回答