在 ServiceStack 的示例中,我没有看到一个应用程序首先是 ASP.NET MVC 网站,然后是 ServiceStack 服务。
让我们看一个非常简单的 ASP.NET MVC Web 应用程序,它通过 Views 呈现产品。它使用控制器、视图、模型和视图模型。
假设我们有一个模型Product
被持久化到一个文档数据库中。假设我们有一个从MVC Razor View/PartialViewProductViewModel
映射并显示的视图模型。Product
所以这是网络方面的事情。现在假设我们想要向各种客户端(如 Windows 8 应用程序)添加返回产品的服务。
请求/响应类是否应该与我们已有的完全断开?我们ProductViewModel
可能已经包含了我们想要从服务返回的所有内容。
由于我们已经有了Product
(模型类),我们不能Product
在 API 命名空间中有另一个类。我们可以,但这会让事情变得不清楚,我想避免这种情况。
那么,我们是否应该在 API 命名空间中引入独立ProductRequest
类和ProductRequestResponse
(继承 ProductViewModel)类?
像这样ProductRequestResponse : ProductViewModel
?
我要说的是,我们已经有了 Model 和 ViewModel 类,并且要为 SS 服务构建 Request 和 Response 类,我们必须创建另外两个文件,主要是通过从我们已有的类中复制所有内容。这在我看来并不 DRY,它可能遵循关注点分离准则,但 DRY 也很重要,实际上不仅仅是分离所有内容(分离所有内容会导致代码重复)。
我想看到的是一个已经制作了 Web 应用程序的情况,它当前具有模型和视图模型并返回适当的视图以在 Web 上显示,但可以扩展为功能齐全的服务以支持程序化客户端?像 AJAX 客户端等......我们已经拥有的。
另一件事:
你会看到有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;
}
}