Я думаю, что в javascript он может создать класс Singleton, как показано ниже
test.js
class Container {
constructor() {
this.map = new Map;
}
set(key, value) {
this.map.set(key, value);
}
get(key) {
return this.map.get(key);
}
}
module.exports.Container = new Container();
так что Я мог бы использовать эти другие файлы, например, в index.js
import container from './test'
Однако конструктору контейнера нужны другие параметры, чтобы он мог работать лучше. И контейнер также должен быть классом Singleton, потому что это общий класс. И я не знаю, как его создать?
constructor(servie) {
this.map = new Map;
this.servie = servie;
}
кстати служебная переменная создается при запуске приложения
@MarkMeyer Я хочу инициализировать класс контейнера при запуске приложения. И модуль. Затем экспортирует класс контейнера как класс Singleton, который может работать для другого модуля. И я не умею делать
Обновлено: Я понял, что мое именование немного сбивает с толку, поскольку я использовал контейнер для представления контейнера IoC, а затем понял, что вы использовали это имя для представления своего синглтона.
При условии, что вы можете создать экземпляр своего синглтона в центральной точке кода (например, в файле точки входа при настройке сервера). Вы можете получить синглтон несколькими способами. Например:
let instance = null;
class Singleton {
constructor(arg1, arg2) {
this.arg1 = arg1;
this.arg2 = arg2;
}
}
module.exports = (...args) => {
return instance || (instance = new Singleton(...args));
}
Вы можете сделать это множеством способов, например. со статическими функциями вместо анонимной функции. Тем не менее, со всем этим, я думаю, возникает небольшая путаница относительно того, инициализируете ли вы экземпляр или просто пытаетесь его получить.
На мой взгляд, шаблоны контейнеров IoC (часто используемые в проектах C#) немного чище. Где у вас может быть один класс контейнера, который отслеживает ваши синглтоны и предоставляет отдельные функции доступа и запуска.
class Container {
constructor() {
this.instances = {};
}
add(name, instance) {
this.instances[name] = instance; // depends if you want overwrite or not
}
get(name) {
if (!this.instances[name]) {
throw new Error('some appropriate error messaging for your app');
}
return this.instances[name];
}
remove(name) {
delete this.instances[name];
}
}
module.exports = new Container(); // this has to be a no-param constructor
Затем в коде инициализации приложения вы инициализируете синглтоны и регистрируете их в своем контейнере:
const Container = require('<path_to_Container>');
const Singleton = require('<path_to_Singleton>');
...
Container.add('mySingleton', new Singleton(arg1, arg2));
и получить к нему доступ в любое время с помощью:
Container.get('mySingleton');
Примечания для пар:
Как вы себе это представляете? Вы вызываете
container('some value')
и получаете объект, а затем вызываетеcontainer('some other value')
и получаете тот же синглтон?