Ответ 1
Я собрал простой легкий контейнер ioc, называемый JsfIoc.
Есть ли какая-либо инверсия структур управления для javascript?
Самый близкий ответ, который можно найти в stackoverflow, который я могу найти, находится здесь: Каков правильный способ соединения двух объектов javascript?. Это похоже на отличное начало, но я думал, что смогу найти что-то с более длинной историей развития.
Я использовал только Castle Windsor, и я действительно скучаю по нему на веб-клиентской площадке.
Я собрал простой легкий контейнер ioc, называемый JsfIoc.
Я начал писать то, что мне никогда не приходилось заканчивать. Не уверен, что я когда-либо буду, поскольку накладные расходы, вероятно, не стоят того. если вам интересно, это: 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
Я искал один последний год и наткнулся на 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}
};
Проверьте инвертированный http://philmander.github.com/inverted/, который был создан с помощью контейнера IOC для Javascript, который я создал. Он работает поверх AMD в браузере, а также работает с Node.
Используемый совместно с AMD, Inverted использует отдельный файл конфигурации, чтобы выразить, как создаются классы и как они взаимодействуют. Как только эти значения по умолчанию и отношения определены, может быть создан контекст приложения, и могут использоваться экземпляры классов.
В динамически типизированных языках, таких как JavaScript и Ruby, DI на самом деле не так полезен.
Основное преимущество DI в статически типизированных языках, таких как Java, в тестировании - заменить реальную реализацию какого-либо класса макетом. Это потому, что в Java-классах неизменяемы, и вы не можете просто легко заменить их макетами - вам нужна целая система DI для этого.
Но в JavaScript вы можете легко заменить существующие классы/методы на насмеханные. Поэтому DI не требуется для обеспечения возможности тестирования.
Конечно, есть и другие сценарии, в которых DI может быть полезным, но вы на самом деле не указали, для чего хотите использовать DI, поэтому я рассмотрел наиболее очевидный случай.
Я использую один, здесь простой код из 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
Я использую его для сборки приложения Backbone.js, есть много объектов (App, Menu, Notice,...), и это облегчает мою жизнь.
WARN: я использую его внутренне с измененными исходными объектами, поэтому могут быть некоторые ошибки:) Пожалуйста, дайте мне знать о них, я, вероятно, исправлю это через день или два (отправив через страницу проблем https://github.com/alexeypetrushin/rad_core/issues).
P.S. Не нравится, что термин IoC слишком широк, DI намного точнее.
Вы можете посмотреть на эту простую библиотеку: fcjs Он очень маленький, но может быть мощным в развязывании кода. Это вдохновило платформу Swiz AS3
Другая (более новая) опция requireJS (http://requirejs.org/).
Мы построили простой контейнер JavaScript IoC под названием hilary.js: https://github.com/Acatar/hilaryjs.
С hilary вы можете регистрировать и разрешать услуги и заводы. Он также поддерживает дочерние контейнеры, если вам нужно или нужно объединить свои контейнеры.
ИЗМЕНИТЬ Я добавил некоторые примеры с использованием hilary, а также пример достижения инъекции зависимостей с require.js:
У меня есть контейнер для создания и IoC для приложений JavaScript, пожалуйста, проверьте его на http://blog.wolksoftware.com/introducing-inversifyjs
Попробуйте canDI. Это простая библиотека вложения и создания объектов. Вы можете создавать синглеты, экземпляры и переменные, которые автоматически регистрируются при создании.
Попробуйте инфузию. Это довольно мощная инфраструктура IoC JS. Он используется несколькими исследовательскими центрами в университетах Торонто и Беркли Infusion
Страница проекта GitHub с дополнительной информацией можно найти здесь страницы Infusion GitHub