Injeção de dependência de Ember (em um tipo de objeto)

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