Vous êtes sur la page 1sur 15

Naoufel KHAYATI Cours « Développement d’Applications

d’Entreprises » (ASP.NET Core MVC)

228

CHAPITRE 6

Dependency Injection
&
IoC Container
Naoufel KHAYATI
naoufel.khayati@eniso.u-sousse.tn
AU. 2021 - 2022

228

Introduction
229

 Le Framework ASP.NET Core est bâti autour de la modularité et de la


flexibilité.

 Ces deux concepts « objets » s’appuient énormément sur l’injection de


dépendances (DI) qui est désormais une caractéristique essentielle du Framework
(implémentée de façon native).

 DI consiste à créer dynamiquement (injecter) les dépendances entre les


différentes classes dans des fichiers de configuration ou dans le code en se
basant sur des abstractions.

 Les dépendances entre les composants logiciels sont déterminées dynamiquement


lors de l’exécution du code.

229

ENISo – IA2 – 2021 / 2022 1


Naoufel KHAYATI Cours « Développement d’Applications
d’Entreprises » (ASP.NET Core MVC)

230

Généralités sur l’Injection


de Dépendances (DI)

230

Dépendance entre objets


231

 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 possède une propriété de type B (dépendance par composition)


 exp. Voiture et Moteur

 A est de type B (dépendance par héritage)


 exp. Voiture et Véhicule

 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

 Une méthode de A appelle une méthode de B.

 Si A dépend de B, alors pour instancier A, on a besoin d’une instance de B ce qui, en


pratique, n'est pas toujours le cas.

231

ENISo – IA2 – 2021 / 2022 2


Naoufel KHAYATI Cours « Développement d’Applications
d’Entreprises » (ASP.NET Core MVC)

Problèmes du couplage fort


232

 Le couplage est une métrique qui mesure l'interconnexion des modules.


 Deux modules sont dits couplés si une modification de l’un nécessite une modification dans
l'autre.

A B C
Dépendance Dépendance
b:B c:C

MethodA() : int MethodB() : int MethodC() : int

 A est fortement couplée à B (A est très dépendante de B).


 A ne peut fonctionner qu’en présence de B.
 Si on crée une nouvelle version de la classe B (supposons B2) ou une nouvelle version de
MethodB() (utilisée dans MethodA()), on sera obligé de modifier la classe A.
 Pire encore si le couplage passe à d’autres niveaux (B dépend de C) !!!

232

Solution au couplage fort


233

 Intégration d’abstractions (interfaces ou classes abstraites)

IA A IB
Association
b : IB

MethodA() : int MethodA() : int MethodB() : int

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

ENISo – IA2 – 2021 / 2022 3


Naoufel KHAYATI Cours « Développement d’Applications
d’Entreprises » (ASP.NET Core MVC)

Recours au DI
234

 D’autres problèmes se posent :


 On dispose dans A d'un objet implémentant IB alors qu'on ne sait pas comment l'instancier.
 Si on utilise l’opérateur new : (IB b = new B(); ou IB b = new B2(); )
 La dépendance est toujours là.
 Les dépendances ont été dispersées dans le code.

 La solution consiste à créer, par exemple, un objet b de type IB et de l'injecter dans un objet
de type A.

 L'injection proprement dite peut se faire de différentes manières :


 Par constructeur
 Par méthode
 Par mutateur
 Par propriété

234

DI – Exemples
235

Pas d’injection
(relation de composition)

Injection par constructeur


(classe concrète)

Injection par constructeur


(Interface)

235

ENISo – IA2 – 2021 / 2022 4


Naoufel KHAYATI Cours « Développement d’Applications
d’Entreprises » (ASP.NET Core MVC)

Les principes SOLID


236

 Pour garantir l’injection de dépendance, il faut suivre le principe DIP


(Dependency Inversion Principle).
 L’un des 5 principes SOLID

 SOLID est ensemble de 5 principes de conception, qui se renforcent


mutuellement, destinés à produire des architectures logicielles compréhensibles,
flexibles et maintenables.

236

Les principes SOLID


237

 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

ENISo – IA2 – 2021 / 2022 5


Naoufel KHAYATI Cours « Développement d’Applications
d’Entreprises » (ASP.NET Core MVC)

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

ENISo – IA2 – 2021 / 2022 6


Naoufel KHAYATI Cours « Développement d’Applications
d’Entreprises » (ASP.NET Core MVC)

Absence de DI
240

ManageStudents Class

Client
EXAMPLE
ManageTeachers Class uses ManageCourses Class

uses uses
uses
DbService

Service
uses uses

……… ………

240

Absence de DI Dépendance => Couplage fort


241

uses uses uses uses


uses uses

241

ENISo – IA2 – 2021 / 2022 7


Naoufel KHAYATI Cours « Développement d’Applications
d’Entreprises » (ASP.NET Core MVC)

Solution avec DI
242

uses

implements implements

242

243

DI et IoC Container
dans ASP.NET Core

243

ENISo – IA2 – 2021 / 2022 8


Naoufel KHAYATI Cours « Développement d’Applications
d’Entreprises » (ASP.NET Core MVC)

DI dans ASP.NET Core


244

 Si on lance l’exécution de l’exemple du slide 242, on aura l’exception


suivante :

 Qu’est ce qui manque ???


 Ilmanque la déclaration du service.
 En d’autres termes, il n’est pas ajouté au conteneur des services.
 Chose à faire dans Program.cs, pour les applications ASP.NET Core.

244

DI dans ASP.NET Core


245

 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

ENISo – IA2 – 2021 / 2022 9


Naoufel KHAYATI Cours « Développement d’Applications
d’Entreprises » (ASP.NET Core MVC)

DI dans ASP.NET Core


246

 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

DI dans ASP.NET Core – Configuration de l’IoC Container


247

 Cette configuration consiste en l’ajout des services (interface et implémentation)


dans le catalogue des types abstraits.

 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

ENISo – IA2 – 2021 / 2022 10


Naoufel KHAYATI Cours « Développement d’Applications
d’Entreprises » (ASP.NET Core MVC)

DI dans ASP.NET Core – Ajout d’un service


248

 L’enregistrement d’un nouveau service dans la collection du conteneur


se fait en utilisant les diverses méthodes prédéfinies AddX() de la
collection « Services ».

248

DI dans ASP.NET Core – Ajout d’un service


249

 On peut aussi utiliser la méthode Add() d’un objet IServiceCollection :

 Le premier paramètre est le type abstrait (l’interface) du service,


 le deuxième est l’implémentation de ce dernier,
 le troisième est sa durée de vie (Transient, Singleton, Scoped).

 Ajout du service SQLServerDB

 NB : Quand on ne spécifie pas le Lifetime, par défaut ce serait « Singleton ».

249

ENISo – IA2 – 2021 / 2022 11


Naoufel KHAYATI Cours « Développement d’Applications
d’Entreprises » (ASP.NET Core MVC)

DI dans ASP.NET Core – Ajout d’un service


250

 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

DI dans ASP.NET Core – Ajout d’un service


251

 Transient

 Un service enregistré dans le conteneur IoC avec « Transient » (transitoire),


sera instancié pour chaque objet (contrôleur, action, etc.) qui lui fera appel.
 Une instance d’un tel service ne sera jamais partagée à plus d’un objet.

 ASP.NET Core offre l’extension AddTransient() pour cette option.

251

ENISo – IA2 – 2021 / 2022 12


Naoufel KHAYATI Cours « Développement d’Applications
d’Entreprises » (ASP.NET Core MVC)

DI dans ASP.NET Core – Ajout d’un service


252

 Scoped

 Un service enregistré dans le conteneur IoC avec « Scoped » (à portée),


sera :
 le même pour tous les objets dans une requête HTTP,
 différent pour différentes requêtes.

 ASP.NET Core offre l’extension AddScoped() pour cette option.

252

DI dans ASP.NET Core – Ajout d’un service


253

 Singleton

 Un service enregistré dans le conteneur IoC avec « Singleton », sera


instancié une seule fois et cette même instance sera utilisée par tous les
composants de l’application.

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

 ASP.NET Core offre l’extension AddSingleton() pour cette option.

253

ENISo – IA2 – 2021 / 2022 13


Naoufel KHAYATI Cours « Développement d’Applications
d’Entreprises » (ASP.NET Core MVC)

DI – Méthodes d’extension
254

 A un moment donné, le nombre de services enregistrés peut devenir assez


important de façon que la lecture et la maintenance de Program.cs deviennent
très difficile.

 On peut éviter ceci en groupant l’enregistrement de ces dépendances dans une


méthode d’extension définie dans une classe statique.

 Cette méthode (elle aussi statique) sera ajoutée à la liste des méthodes de
IServiceCollection (grâce à « this »).

254

Pour Finir…
255

 Exemples courants dans ASP.NET Core

 Injection par constructeurs

Interface Classe concrète

255

ENISo – IA2 – 2021 / 2022 14


Naoufel KHAYATI Cours « Développement d’Applications
d’Entreprises » (ASP.NET Core MVC)

DI – Exemples
256

 Exemples courants dans ASP.NET Core

 Injection par méthodes : dans les actions

 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

ENISo – IA2 – 2021 / 2022 15

Vous aimerez peut-être aussi