4.2、数据库服务接口

定义服务接口与定义Java接口一样简单,只是需要遵循一些规则才可以使代码生成功能正常工作,并确保与Vert.x中其他代码的互操作性。

接口定义的开始是:

@ProxyGen
public interface WikiDatabaseService {
  @Fluent
  WikiDatabaseService fetchAllPages(Handler<AsyncResult<JsonArray>> resultHandler);
  @Fluent
  WikiDatabaseService fetchPage(String name, Handler<AsyncResult<JsonObject>> resultHandler);
  @Fluent
  WikiDatabaseService createPage(String title, String markdown, Handler<AsyncResult<Void>> resultHandler);
  @Fluent
  WikiDatabaseService savePage(int id, String markdown, Handler<AsyncResult<Void>> resultHandler);
  @Fluent
  WikiDatabaseService deletePage(int id, Handler<AsyncResult<Void>> resultHandler);
  // (...)
  1. ProxyGen注释用于触发服务客户端的代理生成;
  2. Fluent注释是可选的,但通过返回服务实例可以允许链式操作的Fluent接口;当服务被其他JVM语言消费时,这对于代码生成器最为有用 ;
  3. 参数类型需要是:字符串,Java原始类型,JSON对象或数组,任何 枚举类型或java.util集合(List / Set / Map)。持任意Java类唯一的办法是将它们作为Vert.x数据对象,注释为@DataObject。传递其他类型的最后机会是服务引用类型;
  4. 由于服务提供异步结果,服务方法的最后一个参数需要 一个处理器<AsyncResult <T >>其中T是适用于上面所述代码生成的任何类型 。

这是一个很好的做法:服务接口提供静态方法通过事件总线创建实际服务实现代码和代理客户端代码。

我们将create定义为简单地委派给实现类及其构造函数:

static WikiDatabaseService create(JDBCClient dbClient, HashMap<SqlQuery, String> sqlQueries, Handler<AsyncResult<WikiDatabaseService>> readyHandler) {
  return new WikiDatabaseServiceImpl(dbClient, sqlQueries, readyHandler);
}

Vert.x代码生成器创建代理类,并通过后缀VertxEBProxy将其命名。这些代理类的构造方法需要引用Vert.x上下文以及事件总线上的目的地地址:

static WikiDatabaseService createProxy(Vertx vertx, String address) {
  return new WikiDatabaseServiceVertxEBProxy(vertx, address);
}

上一次迭代中内部类的SqlQuery和ErrorCodes枚举类型已被提取为包保护类型,请参阅SqlQuery.java和ErrorCodes.java。

results matching ""

    No results matching ""