Injection de dépendances

L'utilisation d'injection de dépendances et d'un médiateur permet de mettre en place les principes du CQRS.

L'injection ne se fait que par une composition racine et les services ne doivent être injectés que pendant l' initilisation d'un objet.

Si cet architecture n'est pas commune pour les SPA, il en va d'un choix volontaire afin de fournir une API robuste et flexible.

Composition racine

Vous devez récupérer le module principal et l'éxécuter afin d'initier la composition racine.

      

import {inject, injectable} from "inversify";
import "reflect-metadata";
import {
MainLibModule
} from "@adclz/fevermainlib/kernel";
 
const Kernel = MainLibModule()
 

get

get permet de récupérer un service depuis le kernel.

Vous ne devez pas fournir Kernel à l'ensemble de votre application, car ceci est équivalent à un faire service-locator.
A la place vous devez réclamer les services avec la méthode get, puis les injecter dans votre application.
      

import {inject, injectable} from "inversify";
import "reflect-metadata";
import {
MainLibModule
} from "@adclz/fevermainlib/kernel";
import AuthService from "@adclz/fevermainlib/services/auth"
import LogsService from "@adclz/fevermainlib/services/log"
 
const Kernel = MainLibModule()
 
const authService = Kernel.get(AuthService)
const logService = Kernel.get(LogsService)
 

bind

bind permet d'enregistrer un nouveau service dans le kernel.

Référez vous à la section Extensions pour comprendre comment étendre la composition racine.

Frameworks

Vue

Voici un exemple avec le framework Vue qui permet de rendre les services accessibles partout graçe à la méthode provide.
Puis vous pouvez récupérer le service correspondant via inject.
Le fichier contenant le kernel doit être le plus proche possible de l'entrée votre application!

Afin de permettre à Vue de suivre les changements dans le Kernel, une méthode MakeReactive réattribue les services du kernel en utilisant reactive.
<script lang="ts">
import {defineComponent, provide, reactive} from "vue";
import {MainLibModule} from "@adclz/fevermainlib/kernel";
import {Container} from "inversify";

import AuthService from "@adclz/fevermainlib/services/auth"
import LogsService from "@adclz/fevermainlib/services/log"

const MakeReactive = <T extends object>(Kernel: Container, Service: new(...args: any[]) => T) => {
  const GetService = Kernel.get<T>(Service)
  Kernel.rebind<T>(Service).toConstantValue(reactive(GetService) as T)
}

export default defineComponent({
  setup() {
    const Kernel = MainLibModule()

    MakeReactive(Kernel, AuthService)
    MakeReactive(Kernel, LogsService)

    provide("AuthService", Kernel.get(AuthService))
    provide("LogsService", Kernel.get(LogsService))
  }
})
</script>