Должен ли 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.