Кратко о проекте: Контейнер с сервис локацией и инъекцией зависимостей.
Собственно ссылка на вики по этому самому апи - там примеры указания типов для инъекций и декларации поведения "сервисов":
https://github.com/SerafimArts/DependencyInjecton/wikiДублировать не хочется, т.к. оно довольно километровое.
У JS есть несколько проблем с которыми я столкнулся:Что хотелось бы:
Инъектить через flowtype (
https://flowtype.org/ ):
class Some {
constructor(user: User, guard: BaseAuth) { ... }
}
Проблема:
Нельзя получить информацию о типах при использовании FlowType для автоматической инъекции аргументов. Вот этот плагин не работает:
https://www.npmjs.com/package/babel-plugin-type-me... Решение:
Решено было сделать через декораторы (
babel-plugin-decorators-legacy), в частности
@Inject с указанием типов аргументов или сервис-локатор в них.
Не хотелось бы использовать нестандартный легаси синтаксис/поведение (декораторы). Есть идеи как ещё можно?
Хотелось бы #2:
Иметь два метода: `bind` для фектори и `singleton` для одиночек и в зависимости от типа второго аргумента определять способ декларации (для класса в случае `bind` каждый раз новый объект, для функции - вызов функции и т.д.):
app.bind('some', User);
app.make('some') // новый объект User
app.make('some') // новый объект User, совершенно другой, нежели раньше
app.bind('some', (app: Container) => new User('some', 'any'));
app.make('some') // вызываем замыкание, прокидываем контейнер (резолв из flowtype) и возвращаем результат
app.make('some') // Проделываем тоже самое ещё раз
Проблема #2:
В ES6 невозможно определить является ли функция методом, классом или обыкновенной функцией.
Решение #2:
Разделил методы на несколько, разных:
1) Создаёт инстанс от функции
2) Вызывает функцию
3) Вызывает функцию с указанным контекстом
Т.е. пришлось делать километр разных функций, вместо пары с полиморфичным поведением (если так можно выразиться).
Есть ещё идеи как можно упростить/улучшить апи, чтобы этим было удобно пользоваться? Там есть небольшой пример реализации (на код, в принипе можно положить болт, т.к. сейчас стадия проектировки), но из-за косяков в JS решил вначале заняться проектированием интерфейса.