【问题标题】:JS: blending two classesJS:混合两个类
【发布时间】:2019-10-26 09:05:55
【问题描述】:

使用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 文件有点长,部分原因是它管理了许多类型的数据库层,所以我在考虑如何重构它。

我想使用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 文件中的方法?

【问题讨论】:

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


    【解决方案1】:

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

    你的配置看起来像:

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

    【讨论】:

    • 有道理,但是我在设置继承自我的抽象类同时还扩展 RESTDataSource 的 API 时遇到问题,不是吗?
    • JavaScript 类不支持多重继承。如果需要,您可以让您的存储库类扩展 RESTDataSource。在我看来,通过实现一个额外的类,你并没有真正获得太多——RESTDataSource 已经在你的应用程序和底层数据源之间充当了一个抽象级别。
    猜你喜欢
    • 2018-10-09
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 2016-10-19
    • 2015-04-14
    • 1970-01-01
    相关资源
    最近更新 更多