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

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

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

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

1 ответ

Решение

Я бы не сделал ни того, ни другого.

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

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

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

Несмотря на то, что я хотел бы, чтобы Controllers + ServiceStack разделял функциональность через службу C# greet выше, вы также можете вызвать службу 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 наследуются от ServiceStackController, это необязательно, но позволяет вам совместно использовать одни и те же атрибуты Session / Caching / Authentication + RequiredRole/RequiredPermission в MVC и ServiceStack.

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

Другие вопросы по тегам