我正在使用ServiceStack将我的胖客户端连接到我们的API服务器,我非常喜欢它。但是,我发现必须为每个请求(Foo,FooResponse和FooService)编写三个类,这有点令人烦恼。
在我的项目中,我有很多DAO接口,看起来像这样:
public interface ICustomerDao {
public IList<Customer> FindCustomers(long regionId, string keyword);
}
我希望能够说出这样的话:
public interface ICustomerDao {
[AutoApi("Loads customers for the given region whose names match the keyword")]
[AutoRoute("/search/customer/{regionId}/{keyword}"]
public IList<Customer> FindCustomers(long regionId, string keyword);
}
public class SomeBusinessLogic {
[AutoService(typeof(ICustomerDao))]
public IList<Customer> FindCustomers(long regionId, string keyword) {
// lots of business logic here
}
}
然后,我想为我自动生成以下类:
FindCustomers
:ServiceStack DTO请求FindCustomersResponse
:回复FindCustomersService
:一个服务,它接受FindCustomers DTO,然后调用SomeBusinessLogic.FindCustomers(req.RegionId, req.Keyword)
并将其返回值包装在FindCustomersResponse
ApiServiceCustomerDao
:通过自动生成构建FooRequest的方法实现ICustomerDao
并联系相应的服务,然后接收FooResponse并自动解压缩。这样的事情已经存在吗?如果没有,实施起来有多难?还有更好的方法吗?
答案 0 :(得分:2)
我首先建议查看AutoQuery,了解它是否适合快速创建数据驱动的服务。
由于ServiceStack推广代码优先开发模型,而您的请求和响应DTO代表您的服务合同,我强烈建议不要尝试动态生成它们,因为您应该保留对其定义的完全控制,但您可以将它们用作模板通过遵循相同的方法AutoQuery动态生成您自己的服务实现。
在AutoQuery中,您只需要定义Request DTO,其余的Service实现都是动态生成和注册的。由于它返回标准QueryResponse<T>
响应类型,因此动态生成DTO,并且由于代码优先的请求DTO,客户端AutoQuery uses to generate your Services implementations and register them dynamically,例如:
var movies = client.Get(new FindMovies { Ratings = new[]{"G","PG-13"} });