¿ServiceStack debe ser la capa de servicio en una aplicación MVC o debe llamar a la capa de servicio?


Estoy creando un sitio web MVC y también tengo la intención de crear una API web para su uso tanto dentro del sitio web y potencialmente por terceros.

Desde los controladores MVC llamaré a una capa de servicio que contendrá lógica de negocios, actuará sobre modelos de dominio, realizará validación, realizará llamadas a servicios externos de infraestructura, etc. La capa de servicio, a su vez, llamará a los repositorios para cualquier interacción con la base de datos.

Ahora, me gusta el aspecto de ServiceStack y la intención de usándolo para la Web API-parece más maduro que el ASP.NET MVC 4 Web API . Mi pregunta es, ¿debo tener la llamada de la API ServiceStack en mi capa de servicio anterior, similar a los controladores MVC, o debo convertirla en la capa de servicio, dando servicio tanto a los clientes web como a los controladores MVC?

Author: Gavin, 2012-05-13

1 answers

No haría ninguna de las dos cosas.

Idealmente tanto MVC como ServiceStack deberían usar y compartir dependencias puras de C#. Un buen ejemplo de un sitio web MVC + ServiceStack viviendo armoniosamente juntos es en el proyecto de demostración SocialBootstrapApi , que se ha desplegado en AppHarbor en: http://bootstrapapi.apphb.com

Registraría todas sus dependencias en su ServiceStack AppHost y luego registraría un MVC Controller factory para que tanto sus Controladores MVC como Los servicios ServiceStack se conectan automáticamente con estas dependencias.

En su 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));
}

Ejemplo de servicio ServiceStack usando IGreeter

public class HelloService : Service {
    public IGreeter Greeter { get; set; } //Autowired

    public HelloResponse Get(Hello request) {
        return new HelloResponse { 
           Result = Greeter.SayHelloTo(request.Name) };
    }
}

Ejemplo de Controlador MVC usando el mismo IGreeter:

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

    public void Index(string name) {
       ViewBag.GreetResult = Greeter.SayHelloTo(name);
       return View();
    }        
}

La idea general es para la lógica dentro de los controladores MVC y los servicios ServiceStack deben preocuparse por la capa HTTP/punto de integración, es decir, recopilar la entrada del usuario de las variables QueryString o FORM POST'ed y llamar a la lógica C # pura / comprobable con ella preparando la Respuesta, en ServiceStack que estaría rellenando el DTO de respuesta mientras que para un Controlador MVC estaría rellenando el ViewModel.

Llamando a servicios ServiceStack desde un Controlador MVC

Aunque tendría la funcionalidad de compartir Controladores + ServiceStack a través de un servicio de saludo C # anterior, también puede llamar a un servicio ServiceStack desde un controlador MVC como:

public HelloController : ServiceStackController {

  public void Index(string name) 
  {
    using (var helloService = AppHostBase.ResolveService<HelloService>())
    {
       ViewBag.GreetResult = helloService.Get(name).Result;
       return View();
    }
  }        
}

Compartir Sesión / almacenamiento en caché con el ServiceStackController

Aunque el MVC Los ejemplos de controladores heredan del ServiceStackController, no es necesario pero le permite compartir los mismos atributos Session / Caching / Authentication + RequiredRole/RequiredPermission en MVC y ServiceStack.

Ver el MVC PowerPack para otros beneficios que ServiceStack trae a MVC.

 37
Author: mythz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-08 05:19:24