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.
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.
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!
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>