Есть ли какая-либо инверсия структур управления для javascript?

Есть ли какая-либо инверсия структур управления для javascript?

Самый близкий ответ, который можно найти в stackoverflow, который я могу найти, находится здесь: Каков правильный способ соединения двух объектов javascript?. Это похоже на отличное начало, но я думал, что смогу найти что-то с более длинной историей развития.

Я использовал только Castle Windsor, и я действительно скучаю по нему на веб-клиентской площадке.

Ответы

Ответ 2

Я начал писать то, что мне никогда не приходилось заканчивать. Не уверен, что я когда-либо буду, поскольку накладные расходы, вероятно, не стоят того. если вам интересно, это: http://code.google.com/p/jasproject/wiki/JasFac (что часть IoC, полный набор находится в http://code.google.com/p/jasproject/)

Издевательская библиотека довольно полна (нет ожиданий, хотя на данный момент я просто использую утверждения для макетов/заглушек), но рамки модульного тестирования отсутствуют. Часть IoC довольно полная, но может иметь несколько ошибок (не думайте об этом, хотя)

Не стесняйтесь использовать его и/или помогать, я могу помочь там, где вам нужно.

EDIT: больше всего можно увидеть в модульных тестах для jasfac: https://jasproject.googlecode.com/svn/trunk/Jas.Tests/JasFacTests.js

Ответ 3

Я искал один последний год и наткнулся на squirrel-ioc. Мне было что-то не понравилось - я думаю, что он поддерживал только однострочные экземпляры стиля.

Белка - это контейнер IoC реализован в Javascript для продвижения лучшее использование архитектуры и шаблоны в браузере Javascript приложения

Я начал писать свои собственные и получил довольно далеко (инсталляция конструктора и сеттера, значения и ссылки, поддержка singleton, тесты JsUnit), но никогда не нуждалась в ней в моем приложении. Возможно, мне придется проверить проект Люка. Для справки, вот пример формата конфигурации, в котором я закончил.

var iocConfig = {
  "a" : { Type : A },
  "b1" : { Type : B, Props : [{Name : 'Letter', Ref : "a"}]  },
  "b2" : { Type : B, Props : [{Name : 'Letter', Val : "a"}]  },
  "c2" : { Type : C, Args : [{Ref : "a"}, {Val : "a"}]  },
  "d" : { Type : D, Props : [{Name : 'Letter', Ref : "a"}]  },
  "date" : { Type : Date, Props : [{Name : 'FullYear', Val : 2008}, {Name : 'Month', Val : 0}, {Name : 'Date', Val : 1}]  },
  "array3" : { Type : Array, Args : [{Val : 3}]  },
  "number1" : { Type : Number, Args : [{Val : 1}]  },
  "string1" : { Type : String, Args : [{Val : "1"}]  },
  "s-true" : { Type : S, Singleton : true},
  "s-false" : { Type : S, Singleton : false}
};

Ответ 4

Проверьте инвертированный http://philmander.github.com/inverted/, который был создан с помощью контейнера IOC для Javascript, который я создал. Он работает поверх AMD в браузере, а также работает с Node.

Используемый совместно с AMD, Inverted использует отдельный файл конфигурации, чтобы выразить, как создаются классы и как они взаимодействуют. Как только эти значения по умолчанию и отношения определены, может быть создан контекст приложения, и могут использоваться экземпляры классов.

http://dailyjs.com/2013/01/04/controldeck-xlsx-inverted/

Ответ 5

В динамически типизированных языках, таких как JavaScript и Ruby, DI на самом деле не так полезен.

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

Но в JavaScript вы можете легко заменить существующие классы/методы на насмеханные. Поэтому DI не требуется для обеспечения возможности тестирования.

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

Ответ 6

Я использую один, здесь простой код из specs (it CoffeeScript):

di.register 'a', -> 'component a'
di.get('a').should be: 'component a'

Существуют также обратные вызовы, различные области применения (приложение, экземпляр, пользовательский), возможность явно назначать компоненты.

DI: https://github.com/alexeypetrushin/rad_core/blob/master/assets/lib/dependency_injection.coffee

Spec: https://github.com/alexeypetrushin/rad_core/blob/master/assets/lib_spec/dependency_injection_spec.coffee

Я использую его для сборки приложения Backbone.js, есть много объектов (App, Menu, Notice,...), и это облегчает мою жизнь.

WARN: я использую его внутренне с измененными исходными объектами, поэтому могут быть некоторые ошибки:) Пожалуйста, дайте мне знать о них, я, вероятно, исправлю это через день или два (отправив через страницу проблем https://github.com/alexeypetrushin/rad_core/issues).

P.S. Не нравится, что термин IoC слишком широк, DI намного точнее.

Ответ 7

Вы можете посмотреть на эту простую библиотеку: fcjs Он очень маленький, но может быть мощным в развязывании кода. Это вдохновило платформу Swiz AS3

Ответ 8

Другая (более новая) опция requireJS (http://requirejs.org/).

Ответ 9

Мы построили простой контейнер JavaScript IoC под названием hilary.js: https://github.com/Acatar/hilaryjs.

С hilary вы можете регистрировать и разрешать услуги и заводы. Он также поддерживает дочерние контейнеры, если вам нужно или нужно объединить свои контейнеры.

ИЗМЕНИТЬ Я добавил некоторые примеры с использованием hilary, а также пример достижения инъекции зависимостей с require.js:

Ответ 11

Попробуйте canDI. Это простая библиотека вложения и создания объектов. Вы можете создавать синглеты, экземпляры и переменные, которые автоматически регистрируются при создании.

https://github.com/bflemi3/canDI

Ответ 12

Попробуйте инфузию. Это довольно мощная инфраструктура IoC JS. Он используется несколькими исследовательскими центрами в университетах Торонто и Беркли Infusion

Страница проекта GitHub с дополнительной информацией можно найти здесь страницы Infusion GitHub