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

Cra*_*g A 23 asp.net-mvc service-layer servicestack asp.net-web-api

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

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

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

myt*_*thz 37

我也不会.

理想情况下,MVC和ServiceStack都应该使用和共享纯C#依赖项.MVC + ServiceStack网站和谐共处的一个很好的例子是SocialBootstrapApi演示项目,该项目已部署在AppHarbor上:http://bootstrapapi.apphb.com

我会在您的ServiceStack AppHost中注册所有依赖项,然后注册一个MVC Controller工厂,这样您的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));
}
Run Code Online (Sandbox Code Playgroud)

使用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) };
    }
}
Run Code Online (Sandbox Code Playgroud)

使用相同IGreeter的MVC控制器示例:

public HelloController : ServiceStackController {
    public IGreeter Greeter { get; set; } //Autowired

    public void Index(string name) {
       ViewBag.GreetResult = Greeter.SayHelloTo(name);
       return View();
    }        
}
Run Code Online (Sandbox Code Playgroud)

一般的想法是MVC控制器内部的逻辑和ServiceStack服务应该关注HTTP层/集成点,即从QueryString或FORM POST的变量收集用户输入并用它调用纯/可测试的C#逻辑然后准备响应,在ServiceStack中填充Response DTO,而对于MVC Controller,您将填充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();
    }
  }        
}
Run Code Online (Sandbox Code Playgroud)

使用ServiceStackController共享会话/缓存

虽然MVC Controller示例继承自ServiceStackController,但它不是必需的,但允许您在MVC和ServiceStack中共享相同的Session/Caching/Authentication + RequiredRole/RequiredPermission属性.

请参阅MVC PowerPack,了解ServiceStack为MVC带来的其他好处.