Можно ли построить структуру аддона in-repo, которая дополнительно расширяет базовый аддон, но приложение об этом не знает?
Я пытаюсь сделать базовый аддон в репо, который обеспечивает функциональность через пространство имен, как platform/services/whatever
,
В дополнение к этому я хочу, чтобы, если другой аддон isEnabled(), который расширяет или повторно открывает тот же сервис (каким-то образом), я хочу, чтобы он был объединен без необходимости вызывать сервис второго аддона по имени, например platform-second/services/whatever
Я просто хочу красивую чистую абстракцию. Причина, по которой я делаю это таким образом, заключается в том, что на основе переменной ENV мне нужно встроить / внедрить разные вещи в index.html и разные app.imports.
и я хочу, чтобы он был полностью разделен на отдельные маленькие дополнения в репо, чтобы сохранить его в чистоте.
Я хочу, чтобы приложение не должно знать platform
но просто быть в состоянии использовать методы общего platform
добавить.
Так например platform.services.whatever.myMethod()
может быть noOp по умолчанию, но если второй аддон расширяет и реализует это, он автоматически запустит эту версию.
Интересно, если я вообще что-то понимаю LOL
Если у вас есть какие-либо советы или рекомендации о том, как можно реализовать эту настройку, пожалуйста, дайте мне знать.
В настоящее время у меня есть встроенные дополнения в репо, но в идеале у меня будет база platform
аддон будет тот, который на самом деле имеет app
содержимое папки и другие дополнения, которые "расширяют" или "переопределяют" методы / свойства объектов этого дополнения, isEnabled()
на основе этой переменной ENV.
Я должен добавить, что я не могу просто сделать дерево слияния и переопределить исходный файл, потому что мне нужна базовая функциональность этих файлов.
Так что, если я расширяю один метод из базы platform.services.whatever.myMethod()
тогда мне все еще нужны остальные методы и свойства сервисов.
1 ответ
Поэтому мне трудно быть слишком конкретным, потому что ваш вопрос был немного расплывчатым в деталях, но не о чем беспокоиться. Я выскажу некоторые идеи, и мы надеемся, что вместе сможем прийти к некоторым полезным выводам:)
Если вам нужны разные объекты во время выполнения, задача состоит в том, чтобы зарегистрировать разные версии вашей службы в контейнере внедрения зависимостей в зависимости от конфигурации (как это обычно бывает в программировании на основе DI). Таким образом, ваш базовый сервис находится в вашем аддоне, и даже некоторые конкретные реализации, которые расширяют базу с помощью различных реализаций определенных методов. И затем, в вашем приложении, у вас есть инициализатор, который просматривает различные переменные ENV и определяет, какие из служб внедрить. Вы всегда вводите под одним и тем же ключом service:some-service
, Так, baseClass = Ember.Object.extend()
а также impl1 = baseClass.extend({methodToOverride: ...}
позволяет вам сохранить все методы baseClass, кроме методов, которые вы переопределяете. Таким образом, вы успешно избежали того, кто звонил, должен был знать, обрабатывает ли его родитель или ребенок service.someMethod
Теперь, если это только во время сборки, то ваш в файле node.js (require()
а также module.exports
, С pojos или es6 у вас есть несколько способов добиться наследования (наследование прототипа, $.extend для иерархического объединения pojos, es6 extends
)...сделайте ваш выбор. Но только с точки зрения шаблонов программирования кажется, что вашему аддону нужно будет представить фабрику, которая абстрагируется от создания объекта, соответствующего какому-либо интерфейсу. Поэтому экспортируйте некоторый модуль, который имеет метод create, который принимает объект параметров и возвращает правильный impl.