JS:混合两个类

时间:2019-06-11 22:02:04

标签: javascript class abstract-class subclass apollo-server

使用Apollo server,进行标准设置:

在管理我的Apollo服务器状态的index.js文件中:

const { ApolloServer } = require('apollo-server-express');
const databaseAPI = require('../database/database.datasource');
...
module.exports = new ApolloServer({
    ...
    dataSources: () => {
        return {
            databaseAPI: new databaseAPI()
        };
    },
    ...
});

然后是我的database.datasource.js文件:

const { RESTDataSource } = require("apollo-datasource-rest");

// imports and config here

class databaseAPI extends RESTDataSource {
  constructor() {
    super();
  }

// methods here like createUser({email, password, name})

}

module.exports = databaseAPI;

这个database.datasource.js文件有点长,部分是因为它正在管理许多类型的db层,所以我在考虑如何重构它。

我想使用repository pattern按主要类型将其分解,例如:

UserRepository.js(以及类似的抽象类作为参考,并用于强制使用内部API)

class UserRepository {

  createUser({ email, password, name }) {
    throw new Error("Not implemented");
  }

  ...

}

export default UserRepository;

,然后在按类型的目录中实现这些实现:

/UserRepository/db.datasource.js

import UserRepository from "../UserRepository";
import utils from './utils';

class UserDatabaseAPI extends UserRepository {
  constructor(db) {
    super();
    this.db = db;
  }

  createUser({ email, password, name }) {
    // logic here
  }
}

export default UserDatabaseAPI;

我的问题是如何最好地管理具有多个继承源的根database.datasource.js文件中的多个类。

我可以看到这样做:

const { RESTDataSource } = require("apollo-datasource-rest");
const UserDatabaseAPI = require("./UserRepository/db.datasource.js");
// imports and config here, including a db instance

const userDBAPI = new UserDatabaseAPI(db);

class databaseAPI extends RESTDataSource {
  constructor() {
    super();
  }

createUser = userDBAPI.createUser;
...

}

尽管我认为这可能会让人头疼。是否有另一种方法在这里可能会更好,还是至少有一种方法可以更好地将我的userDBAPI实例中的方法映射到我的根database.datasource.js文件中的方法?

1 个答案:

答案 0 :(得分:0)

您不必为要包装的端点使用单个RESTDataSource,而是可以将其拆分为多个RESTDataSource实例,每个资源一个。例如,https://swapi.co/api可以分为6个具有以下RESTDataSource的差异baseURL实例:

您的配置如下所示:

dataSources: () => ({
  people: new PeopleAPI(),
  films: new FilmsAPI(),
  starships: new StarshipsAPI(),
  vehicles: new VehiclesAPI(),
  species: new SpeciesAPI(),
  planets: new PlanetsAPI(),
})