自动生成服务、它的dto和DAO

本文关键字:DAO dto 它的 服务 自动生成 | 更新日期: 2023-09-27 17:53:42

我使用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: a ServiceStack DTO请求
  • FindCustomersResponse:响应
  • FindCustomersService:一个接受FindCustomers DTO的服务,然后调用SomeBusinessLogic.FindCustomers(req.RegionId, req.Keyword)并将其返回值包装在FindCustomersResponse
  • ApiServiceCustomerDao:通过自动生成方法实现ICustomerDao,该方法构造FooRequest并联系适当的服务,然后接收FooResponse并自动解包。

这样的东西已经存在了吗?如果没有,执行起来有多困难?有没有更好的办法?

自动生成服务、它的dto和DAO

自动查询

我首先推荐使用AutoQuery,看看它是否适合快速创建数据驱动的服务。

动态生成和注册服务

由于ServiceStack提倡代码优先的开发模型,并且您的请求和响应DTO代表您的服务契约,我强烈建议不要尝试动态生成它们,因为您应该保留对其定义的完全控制,但是您可以使用它们作为模板,通过遵循AutoQuery用于生成服务实现并动态注册它们的相同方法来动态生成自己的服务实现。

在AutoQuery中,您只需要定义请求DTO,然后动态生成和注册服务实现的其余部分。由于它返回一个标准的QueryResponse<T>响应类型,没有动态生成DTO,并且由于代码优先请求DTO,客户端仍然保留端到端类型API,例如:

var movies = client.Get(new FindMovies { Ratings = new[]{"G","PG-13"} });