【发布时间】: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