Académique Documents
Professionnel Documents
Culture Documents
228
CHAPITRE 6
Dependency Injection
&
IoC Container
Naoufel KHAYATI
naoufel.khayati@eniso.u-sousse.tn
AU. 2021 - 2022
228
Introduction
229
229
230
230
En programmation objet, on dit qu’un objet de type A dépend d'un objet de type B si au
moins l’un des cas suivants se présente :
A dépend de B qui dépend à son tour de C, donc A dépend de C (dépendance par transitivité) ;
exp. A=Voiture, B=Carrosserie et C =Porte
231
A B C
Dépendance Dépendance
b:B c:C
232
IA A IB
Association
b : IB
Implémentation Implémentation
A et B sont faiblement couplées.
A ne connait que IB. B B2
A peut fonctionner avec n’importe quelle
implémentation de IB (B2 par exemple)
sans modification de son code. MethodB() : int MethodB() : int
Application fermée à la modification et ouverte
à l’extension.
233
Recours au DI
234
La solution consiste à créer, par exemple, un objet b de type IB et de l'injecter dans un objet
de type A.
234
DI – Exemples
235
Pas d’injection
(relation de composition)
235
236
S ingle Responsibility Principle : Une classe ne doit avoir qu’une seule fonctionnalité (un seul objectif
fonctionnel) et, par conséquent, elle ne doit avoir qu'une seule raison de changer.
Open-Closed Principle : Une classe doit être ouverte à l’extension et fermée aux modifications directes
et gênantes.
Liskov Substitution Principle : Les sous-classes doivent pouvoir remplacer leur classe de base (Les
méthodes qui utilisent des objets d’une classe doivent pouvoir utiliser implicitement des objets dérivés
de cette classe) sans altérer l'exactitude du programme.
I
nterface Segregation Principle : Préférer plusieurs interfaces spécifiques pour chaque client plutôt
qu'une seule interface générale.
Dependency Inversion Principle : Il faut dépendre des abstractions, pas des implémentations.
237
Le principe DIP
238
les modules de haut niveau ne doivent pas dépendre des modules de bas niveau.
Les deux devraient dépendre d'abstractions (ex. des interfaces).
Les abstractions ne doivent pas dépendre des détails (ex. classes concrètes).
Les détails doivent dépendre des abstractions
Client
Client
uses
uses
IService
Inversion de
implements dépendance
Service
Service
238
DIP & DI
239
Dependency
Injection
uses uses
implements
239
Absence de DI
240
ManageStudents Class
Client
EXAMPLE
ManageTeachers Class uses ManageCourses Class
uses uses
uses
DbService
Service
uses uses
……… ………
240
241
Solution avec DI
242
uses
implements implements
242
243
DI et IoC Container
dans ASP.NET Core
243
244
Afin d’implémenter la DI, tous les Frameworks font recours à des DI Containers
(appelés aussi IoC Containers ou Injectors) qui sont des catalogues des types
abstraits (interfaces) et leurs implémentations.
Unity, Simple Injector, Ninject, etc.
Client
injects
uses
Injector
(DI Container) IService
implements
Service
245
ASP.NET Core intègre par défaut deux services (les interfaces IServiceProvider et
IServiceCollection) permettant d’offrir les fonctionnalités minimales d’un conteneur.
IServiceProvider gère la création d'objets et leur durée de vie puisqu’il peut les supprimer au
moment opportun.
Il enregistre tous les services dans IServiceCollection et les injecte en tant que dépendances dans une classe.
Dans ASP.NET Core, les dépendances sont donc perçues comme des services.
246
Chaque fois qu’un type abstrait doit être résolu par le conteneur IoC, on doit l’enregistrer.
L’enregistrement des services se fait dans le fichier Program.cs d’une application ASP.NET
Core.
247
248
249
Le conteneur IoC peut définir la durée de vie d’un service dans la collection
des services :
Doit-il fournir la même instance d’un service à tous les objets qui l’utilisent ?
Doit-il fournir à chaque objet une instance différente du service ?
…
ASP.NET Core offre trois options pour définir comment les services sont
instanciés pour les objets appelants.
Transient
Scoped
Singleton
250
Transient
251
Scoped
252
Singleton
Ce service est créé pour le premier composant qui en fait la demande, et utilisé
ensuite pour le reste.
Ce service sera le même pour tous les objets et toutes les requêtes.
253
DI – Méthodes d’extension
254
Cette méthode (elle aussi statique) sera ajoutée à la liste des méthodes de
IServiceCollection (grâce à « this »).
254
Pour Finir…
255
255
DI – Exemples
256
Si un service ne serait utilisé que par une seule action du contrôleur, alors au lieu de le passer en
paramètre au constructeur, on le passe directement en paramètre à la méthode d’action
concernée en ayant recours à l’annotation [FromServices].
256
257
A SUIVRE…
TO BE CONTINUED…
257