为什么ServiceStack的新API会提升"对象"返回类型而不是更强类型的东西?

Nic*_*nes 9 servicestack

例如,如果我有标准的请求和响应DTO,通过链接IReturn<T>,具有如下所示的服务方法签名的原因是什么,如各种在线示例中所示(例如这一个,尽管并非始终如一):

public object Get(DTO.MyRequest request)
Run Code Online (Sandbox Code Playgroud)

而不是:

public IList<DTO.MyResponse> Get(DTO.MyRequest request)
Run Code Online (Sandbox Code Playgroud)

object这里的返回类型只是为了支持输出流的gzip压缩等服务功能,这会导致输出为字节数组吗?似乎人们希望从这些所谓的"动作"调用中获得适当的更强的返回类型,除非我遗漏了一些常见的场景或用例.

myt*_*thz 8

它曾经是新API仅支持object返回类型的限制,但在新API维基页面上的所有示例现在都使用强类型响应时,情况并非如此.

您可能想要返回对象返回类型的原因之一是您是否要在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) }
            }
        };
    }
Run Code Online (Sandbox Code Playgroud)

如果你想根据请求返回不同的响应(虽然这不是我推荐的),它也很有用,例如:

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

        return Db.Select<Movie>();
    }
Run Code Online (Sandbox Code Playgroud)

如果您确实选择退回,object我强烈建议您使用IReturn<T>标记装饰您的Request DTO,以便向ServiceStack提供服务的预期响应.

  • 是的,它会返回你在'CompressedResult`中装饰的DTO.这是你何时使用它的另一个好例子. (3认同)