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

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

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

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

Я бы тоже.

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

Я зарегистрировал бы все ваши зависимости в вашем ServiceStack AppHost, а затем зарегистрировал фабрику controllerа MVC, чтобы ваши MVC-controllerы и службы ServiceStack автоматически подключались к этим зависимостям.

В вашем AppHost:

void Configure(Funq.Container container) { container.Register(c => new Greeter()); //Set MVC to use the same Funq IOC as ServiceStack ControllerBuilder.Current.SetControllerFactory( new FunqControllerFactory(container)); } 

Пример службы IGreeter с использованием 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-controllerа с использованием одного и того же IGreeter:

 public HelloController : ServiceStackController { public IGreeter Greeter { get; set; } //Autowired public void Index(string name) { ViewBag.GreetResult = Greeter.SayHelloTo(name); return View(); } } 

Общая идея заключается в логике внутри MVC-controllerов, а сервисы ServiceStack должны быть связаны с точкой HTTP / точкой интеграции, т.е. собирать пользовательский ввод из переменных QueryString или FORM POST и вызывать чистую / проверяемую логику C # с ней, затем готовя ответ, в ServiceStack, который будет заполнять Response DTO, в то время как для MVC-controllerа вы будете заполнять ViewModel.

Вызов служб ServiceStack с controllerа MVC

Хотя у меня были бы функции Controllers + ServiceStack с помощью службы приветствия C # выше, вы также можете вызвать службу ServiceStack с помощью MVC-controllerа, например:

 public HelloController : ServiceStackController { public void Index(string name) { using (var helloService = AppHostBase.ResolveService()) { ViewBag.GreetResult = helloService.Get(name).Result; return View(); } } } 

Совместное использование сеанса / кэширование с помощью ServiceStackController

Хотя примеры MVC Controller наследуются от ServiceStackController , это необязательно, но позволяет вам использовать одни и те же атрибуты Session / Caching / Authentication + RequiredRole / RequiredPermission в MVC и ServiceStack.

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

Interesting Posts

Как использовать вкладки с программой «Экран» Linux?

Есть ли приложение для регистрации температуры компонента для файла?

Ошибка C #: родительский элемент не содержит конструктор, который принимает 0 аргументов

ClearCase: загрузка старой версии определенного каталога?

Какие каталоги в установке SSD для Windows 7 вы бы связали / соединились с HDD?

Инвертировать цвета на X (или xfce4)

Использование Case / Switch и GetType для определения объекта

Spark spark-submit – jars arguments хочет список запятой, как объявить каталог банок?

Изменение пути библиотеки DL по умолчанию с использованием .libPaths в Rprofile.site не работает

разрешение std :: chrono :: high_resolution_clock не соответствует измерениям

Сканер не видит после пробела

Левое поведение проводника Windows в Windows 7

Есть ли способ заставить все ссылочные сборки загружаться в домен приложения?

Есть ли возможность ANY_VALUE для mysql 5.6?

Что делает метод registerNatives ()?

Давайте будем гением компьютера.