Подтвердить что ты не робот

Должен ли ServiceStack быть служебным слоем в приложении MVC или должен ли он вызвать сервисный уровень?

Я создаю веб-сайт MVC, а также намереваюсь создать веб-API для использования как на веб-сайте, так и потенциально сторонних разработчиков.

От контроллеров MVC я буду звонить в сервисный уровень, который будет содержать бизнес-логику, действовать на моделях домена, выполнять проверку, делать внешние вызовы внешней инфраструктуры и т.д. Сервисный уровень, в свою очередь, будет вызывать в репозитории для любых взаимодействий с базой данных,

Теперь мне нравится внешний вид ServiceStack и намеревается использовать его для веб-API - он кажется более зрелым, чем Веб-API ASP.NET MVC 4. Мой вопрос в том, должен ли я иметь вызов ServiceStack API в свой сервисный слой выше, похожий на MVC-контроллеры, или я должен сделать его уровнем обслуживания, обслуживая как веб-клиентов, так и контроллеры MVC?

4b9b3361

Ответ 1

Я бы тоже.

В идеале, как MVC, так и ServiceStack должны использовать и совместно использовать чистые зависимости С#. Хорошим примером совместного использования сайта MVC + ServiceStack является демонстрационный проект SocialBootstrapApi, который был развернут в AppHarbor по адресу: http://bootstrapapi.apphb.com

Я зарегистрировал бы все ваши зависимости в вашем ServiceStack AppHost, а затем зарегистрировал MVC-контроллер 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));
}

Пример службы 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) };
    }
}

Пример MVC-контроллера с использованием того же самого IGreeter:

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 и вызывать чистую/проверяемую логику С# с ней, затем готовить Response, в ServiceStack, который будет заполнять DTO ответа, в то время как для MVC-контроллера вы будете заполнять ViewModel.

Вызов служб ServiceStack с контроллера MVC

Несмотря на то, что у меня были бы общие возможности Controllers + ServiceStack с помощью службы приветствия С# выше, вы также можете вызвать службу ServiceStack из MVC-контроллера, например:

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, это необязательно, но позволяет вам использовать те же атрибуты Session/Caching/Authentication + RequiredRole/RequiredPermission в MVC и ServiceStack.

Смотрите MVC PowerPack для других преимуществ, которые ServiceStack приносит в MVC.