2013-02-14 36 views
9

例如,如果我有标准的请求和响应DTO,通过IReturn<T>链接起来,具有如下的服务方法签名的原因是什么,如各种在线示例中所示(例如this one,尽管并非始终如一):为什么ServiceStack的新API会提升“对象”返回类型而不是更强类型的东西?

public object Get(DTO.MyRequest request) 

而非:

public IList<DTO.MyResponse> Get(DTO.MyRequest request) 

是一种object返回类型这里只是简单的支持等的输出流的gzip压缩,这导致在输出端是一个字节数组服务功能?似乎人们会希望从这些所谓的“动作”调用中获得适当的更强的返回类型,除非我错过了一些常见的场景或用例。

回答

8

它曾经是一种限制,即新API仅支持object返回类型,但在New API wiki page的所有示例现在都使用强类型响应的情况下,情况并非如此。

之一,你可能要返回对象返回类型的原因是,如果你想装饰一个HttpResult内响应,如:

public object Post(Movie movie) 
    { 
     var isNew = movie.Id == null; 
     Db.Save(movie); //Inserts or Updates 

     var movie = new MovieResponse { 
      Movie = Db.Id<Movie>(newMovieId), 
     }; 
     if (!isNew) return movie; 

     //Decorate the response if it was created 
     return new HttpResult(movie) { 
      StatusCode = HttpStatusCode.Created, 
      Headers = { 
       { HttpHeaders.Location, Request.AbsoluteUri.CombineWith(movieId) } 
      } 
     }; 
    } 

,如果你想返回不同的也非常有用根据请求的应答(尽管它不是我推荐),例如:

public object Get(FindMovies request) 
    { 
     if (request.Id != null) 
      return Db.Id<Movie>(movie.Id); 

     return Db.Select<Movie>(); 
    } 

如果你选择返回object我强烈建议与装饰你的请求DTO标记为give a hint to ServiceStack该服务的预期响应应该是什么。

+1

谢谢!在我引用的gzip压缩的例子中(例如,通过“ToOptimizedResult ”),是否需要在那里使用“object”返回类型?你没有提到这是需要'object'的情景之一,我注意到'ToOptimizedResult '返回'object'而不是T. – 2013-02-15 16:49:48

+3

是的,它返回你的DTO用'CompressedResult'装饰。这是您使用它的另一个很好的例子。 – mythz 2013-02-15 16:54:53

相关问题