Как заставить синглтон в Typescript работать на нескольких модулях? - PullRequest
0 голосов
/ 24 марта 2019

У меня есть класс Database в приложении для машинописи, которое я использую, и которое настроено как синглтон, например:

export default class Database {
    private static instance: Database;

    //Actual class logic removed

    public static getInstance(): Database {
        if (!Database.instance) {
            Database.instance = new Database();
            Database.instance.logger.debug("Creating new Database Instance");
        } else {
            Database.instance.logger.debug("Using existing Database Instance");
        }
        return Database.instance;
    }
}

Когда я импортирую модуль в другой файл, используя import databaseService from "../services/database.service";, и получаю экземпляр, используя private database = databaseService.getInstance();, он работает должным образом и создает новый экземпляр. Любые дальнейшие попытки getInstance() в том же файле затем используют этот существующий объект.

Однако, если я затем сделаю то же самое в другом файле, он создаст еще один новый экземпляр объекта базы данных. Это нет-нет, так как в конечном итоге это испортит работу логики базы данных.

Как настроить один объект для совместного использования во всем приложении? Желательно, чтобы объект не передавался повсюду, но если так и должно быть, пусть будет так ...

Ответы [ 2 ]

1 голос
/ 28 марта 2019

Как выясняется, возможным решением этой проблемы, как уже упоминалось в комментариях к ответу Estus, была двойная проверка случаев импортированных модулей.

import databaseService from "../services/Database.service"; и import databaseService from "../services/database.service";оба приводят к различным экземплярам синглтона, но не помечаются как проблемы в ОС без учета регистра.

Как только все ссылки были исправлены для использования одного и того же случая, проблема была решена, и только один раз База данныхобъект создан.

1 голос
/ 24 марта 2019

Синглтон-классы являются потенциальными антипаттернами в JavaScript, потому что экземпляр класса без наследования может быть выражен как простой объект.

Явная реализация шаблона синглтона в конструкторе классов является антипаттерном в Node.js и других модульных средах.потому что модули уже предоставляют синглтоны.

Это может быть:

export class Database {}

export default new Database();

Где экспортируемый класс может быть полезен для расширяемости, в TypeScript его необходимо вводить, потому что он действует как интерфейс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...