Freqüentemente, ao desenvolver um sistema, aplicativo ou biblioteca – haverá algum tipo de preocupação transversal que você desejará compartilhar entre os objetos – muito antes mesmo de você saber quais serão todos os objetos no sistema.
O Ember entende essa necessidade e tem ‘inicializadores’ embutidos no framework que fornecem a capacidade de fazer injeção de dependência em uma classe inteira de objetos.
Dê uma olhada nisso:
Ember.Application.initializer({
name: 'racecar',
initialize: function( container, application) {
var Racecar = Em.Object.extend({
start: function() {console.log("start your engine")},
race: function(){return "vroom"}
})
application.register("session:racecar",Racecar);
application.inject("route","racecar","session:racecar")
}
})
Isso em um inicializador que criou uma classe de objetos e a registrou com um nome ‘sessão: carro de corrida’. Esse nome não foi escolhido por nenhum motivo específico – embora pareça
que, usando o formato “tipo: nome”, também estou declarando ‘sessão’ como um tipo de objeto em meu sistema. (o uso da palavra ‘tipo’ será explicado abaixo – no contexto de injetar)
O método ‘register’ é padronizado para usar uma implementação singleton, ele vai invocar ‘create’ no Racecar ‘class’ na primeira solicitação do objeto. O método ‘registrar’ tem algumas opções, conforme especificado aqui: http://emberjs.com/api/classes/Ember.Application.html#method_register
O método ‘injetar’ pode ser usado em uma fábrica específica (este termo é usado para se referir a qualquer objeto com um método de criação) como ‘rota: aplicativo’ ou ‘controlador: índice’ – ou um conjunto inteiro de tipos ‘controlador’, ‘rota’, etc.
Injete a parte que realmente vincula uma fábrica de objeto registrada (injeçãoName) com um nome de propriedade e (propriedade) específicos e coloca em uma fábrica ou tipo (factoryNameOrType) conforme especificado aqui: http://emberjs.com/api/classes/Ember .Application.html # method_inject
Agora que meu inicializador foi configurado, posso criar meu aplicativo ember e esperar que minha propriedade ‘carro de corrida’ exista.
App = Ember.Application.create();
App.Router.map(function() {
// put your routes here
});
App.IndexRoute = Ember.Route.extend({
model: function() {
this.racecar.start()
return ['red', 'yellow', 'blue', this.racecar.race()];
}
});
No exemplo acima, ‘this.racecar’ se referirá à instância singleton de Racecar associada ao nome ‘sessão: corrida’ em meu aplicativo.
Aqui estão mais alguns detalhes de fundo para o leitor interessado.
https://en.wikipedia.org/wiki/Dependency_injection
https://en.wikipedia.org/wiki/Dependency_inversion_principle