Ответ 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.