Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Dependency Injection with Ember

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.

Dependency Injection with Ember

Let's discover or rediscover the Dependency Injection pattern, then look how it can be used in Ember to inject in custom objects.

Avatar for Philippe Bernery

Philippe Bernery

March 27, 2019
Tweet

Other Decks in Technology

Transcript

  1. How to inject in a custom object? // alpha-object.js export

    default class OscarObject { @service sierraService; // does not work out of the box }
  2. Coupled code // coolness-component.js export default class CoolnessComponent extends Component

    { get coolness() { const result = await fetch(`https://ex.co/coolness?dev=${this.developer}`); return result.data.firstObject; } }
  3. Coupled code // coolness-component.js export default class CoolnessComponent extends Component

    { get coolness() { const result = await fetch(`https://ex.co/coolness?dev=${this.developer}`); return result.data.firstObject; } }
  4. Isolated code // coolness-component.js export default class CoolnessComponent extends Component

    { init() { this.categorizer = new CoolnessFetcher(); } get coolness() { return this.categorizer.coolness(this.developer); } }
  5. Isolated and decoupled code // coolness-component.js export default class CoolnessComponent

    extends Component { // this.categorizer is a component param get category() { return this.categorizer.coolness(this.developer); } }
  6. // coolness-component.js export default class CoolnessComponent extends Component { get

    category() { return this.categorizer.coolness(this.developer); } } <!-- template_tango.hbs --> <CoolnessComponent @categorizer={{this.categorizer}} /> <!-- template_zoulou.hbs --> <CoolnessComponent @categorizer={{this.categorizer}} />
  7. // coolness-component.js // global dependencies; export default class CoolnessComponent extends

    Component { get category() { const categorizer = dependencies.getInstanceOf("categorizer"); return categorizer.coolness(this.developer); } }
  8. // dependencies.js class Dependencies { getInstanceOf(type) { switch(type) { case

    'categorizer': return new CoolnessFetcher(); } } } export default new Dependencies();
  9. // dependencies.js class Dependencies { // @param {string} type -

    a type identifier // @param {() => any} factory - a function returning an object register(type, factory) { this.factories[type] = factory; } getInstanceOf(type) { const factory = this.factories[type]; return factory(); } } export default new Dependencies();
  10. // dependencies.js class Dependencies { // @param {string} type -

    a type identifier // @param {() => any} factory - a function returning an object register(type, factory) { this.factories[type] = factory; } getInstanceOf(type) { const factory = this.factories[type]; return factory(); } } export default new Dependencies();
  11. // dependencies.js class Dependencies { // @param {string} type -

    a type identifier // @param {() => any} factory - a function returning an object register(type, factory) { this.factories[type] = factory; } getInstanceOf(type) { const factory = this.factories[type]; return factory(); } } export default new Dependencies();
  12. // coolness-component.js export default class CoolnessComponent extends Component { get

    category() { return this.categorizer.coolness(this.developer); } } <!-- template_tango.hbs --> <CoolnessComponent @categorizer={{this.categorizer}} /> <!-- template_zoulou.hbs --> <CoolnessComponent @categorizer={{this.categorizer}} />
  13. // coolness-component.js export default class CoolnessComponent extends Component { get

    category() { const categorizer = dependencies.getInstanceOf("categorizer"); return categorizer.coolness(this.developer); } } <!-- template_tango.hbs --> <CoolnessComponent /> <!-- template_zoulou.hbs --> <CoolnessComponent />
  14. // india-component.js import { getOwner } from '@ember/application'; export default

    IndiaComponent extends Component { get form() { let container = getOwner(this); return container.lookup('form:india'); } }