В examples для ServiceStack Я не вижу ни одного приложения, которое является веб-сайтом ASP.NET MVC, а затем сделало сервис ServiceStack второй.
Возьмем очень простое веб-приложение ASP.NET MVC, которое отображает продукты через Views. Он использует контроллеры, представления, модели и режимы просмотра.
Скажем, у нас есть модель Product
, которая сохраняется в документе DB. Предположим, что у нас есть viewmodel ProductViewModel
, который отображается из Product
и отображается в MVC Razor View/PartialView.
так что это веб-сторона вещей. Теперь предположим, что мы хотим добавить сервис, возвращающий продукты, для различных клиентов, таких как приложения Windows 8.
Если классы запроса/ответа полностью отключены от того, что у нас уже есть? Наш ProductViewModel
может содержать все, что мы хотим вернуть из службы.
Поскольку у нас уже есть Product
(класс модели), мы не можем иметь еще один класс Product
в пространстве имен API. Ну, мы могли бы, но это делает вещи неясными, и я хотел бы избежать этого.
Итак, следует ли вводить автономный класс ProductRequest
и класс ProductRequestResponse
(наследует ProductViewModel) в пространстве имен API?
Как и ProductRequestResponse : ProductViewModel
?
То, что я говорю, у нас уже есть классы Model и ViewModel, а также для создания классов запроса и ответа для службы SS мы должны были бы создать еще два файла, главным образом путем копирования всего из уже существующих классов. Это не выглядит СУХОЙ для меня, оно может следовать за разделением рекомендаций, но DRY тоже важен, на самом деле больше, чем отделить все (разделение всего приводит к дублированию кода).
То, что я хотел бы увидеть, - это случай, когда веб-приложение уже создано, оно в настоящее время включает модели и ViewModels и возвращает соответствующие представления для отображения в Интернете, но может быть расширено в полностью функциональный сервис для поддержки программных клиентов? Как клиенты AJAX и т.д.... с тем, что у нас уже есть.
Другое дело:
Если вы посмотрите на этот пример https://github.com/ServiceStack/ServiceStack.Examples/blob/master/src/ServiceStack.MovieRest/MovieService.cs
вы увидите, что есть Movie
класс запроса и Movies
класс запроса (один для одного запроса на фильм, другой для списка фильмов). Таким образом, существуют также две службы MovieService
и MoviesService
, одна из которых касается запросов к одному фильму, другая - для жанра фильмов.
Теперь, когда мне нравится подход SS к сервисам, и я думаю, что он правильный, мне не нравится такое разделение просто из-за типа запроса. Что, если я хочу кино режиссера? Я бы изобрел еще один класс запроса, имеющий свойство Director
и еще одну службу (MoviesByDirector
) для него?
Я думаю, что образцы должны быть ориентированы на одну услугу. Все, что связано с фильмами, должно быть под одной крышей. Как добиться этого с помощью ServiceStack?
public class ProductsService : Service
{
private readonly IDocumentSession _session;
private readonly ProductsHelperService _productsHelperService;
private readonly ProductCategorizationHelperService _productCategorization;
public class ProductRequest : IReturn<ProductRequestResponse>
{
public int Id { get; set; }
}
// Does this make sense?
// Please note, we use ProductViewModel in our Views and it holds everything we'd want in service response also
public class ProductRequestResponse : ProductViewModel
{
}
public ProductRequestResponse GetProducts(ProductRequest request)
{
ProductRequestResponse response = null;
if (request.Id >= 0)
{
var product = _session.Load<Product>(request.Id);
response.InjectFrom(product);
}
return response;
}
}