SerafimArts
@SerafimArts
Senior Notepad Reader

Можете предложить идеи/критику апи Di пакета?

Кратко о проекте: Контейнер с сервис локацией и инъекцией зависимостей.

Собственно ссылка на вики по этому самому апи - там примеры указания типов для инъекций и декларации поведения "сервисов": 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 решил вначале заняться проектированием интерфейса.
  • Вопрос задан
  • 200 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы