L'inversion de dédependance facile(et pas chère)
Tu peux m'expliquer l'inversion de dépendance ?
Fastoche, tu ouvres le gestionnaire de package nuget et tu installes AutoFac
Et si on trouvait un moyen simple,efficace Et sans framework d'inverser les dépendences?
반전 et 주입 의존
Le but ici n'est pas de proposer un cours complett sur les principes d'inversion et d'injection de dédependences mais juste de présenter une astuce rapide,facile et pas chère pour effectuer une inversion de dependences avoiráaucun framework.
Si vous ne connaisez pas ces principes,je vous inviteávous rendre sur votre moteur de recherche préféréet d'y saisir les mots clés suivants(pas tous en même temps,hein!):inversion de dépendance / injection de dépendance / dependency inversion / dependency injection / constructor injection / ioc di .
Vous verrez qu'assez souvent cela Vous ramèneál'un ou l'autre des frameworksála mode.Et dans les cas les plus complements,c'est related de ne pas réinventer la roue.Mais dans une 응용 프로그램 이동판은 souvent besoin dequelque에서 de beaucoup에 간단한 sans'encomber d'un 프레임워크 ou d'une biblioth èque suppl é mentaire를 선택했습니다.
Pourquoi une inversion de controlôle?
Sans m'tendre sur le sujet,le but principal de l'inversion de contrôle est de ne pas laisser une classe dépendre d'autres classes.Elle ne doit dépendre quede leurs abstractions.
L'application de ce principe a des conéquence assez variées mais qui vont toutes dans le sens d'un code plus propre et mieux structuré:
존중원칙responsabilité unique: 추상류, 책임류, 내용류
Découplage:les classes ne sont pas liées entre elles
모듈화: 비류 n'tant pas liée á une implementation particuli ère de ses dé dependentials,celle ciest facility 교환 가능.Une même classe pourra,par example,lire les données dans Une base Sql,un fichier json ou xml en fonction de l'implementation du service d'accès aux données injecté.
테스트 가능:puisqu'on ne dépendpas d'une implementation concerète,on peutfacilite user dessimulacrespour effectuer des tests unitaires.
L'intérêt est double:
Le code est lisible car la liste des dépendences d'une classe est directement dans la signature de son constructure:pas de suggest cachée dans Le code de la classe
Ici,les puristes auront sans doute les poils qui se dressent car ce que je vais vous montrer n'est pas au sens strict de l'injection de dédence,mais pour les cas simples,ça en présente tous les avantages.
이것은 좋은 예이다.
L'inversion de contrôle pasápas
파튼 대성당
Partons d'une classe ne suivant aucun pattern particulier,la dédependance est directement instanciée dans le corps de la classe.빌크!
public class MaClasse
{
private readonly MaDepdendance _maDependance;
MaClasse()
{
_maDependance = new MaDependance();
}
}
상상해 보세요. 이것은 실시간 교실MaDependance
dépendeelle-même d'une autre classe,bienvenue au!덴마크는 유엔 총리다. 우리는 단지 간단하게 한마디 했을 뿐이다. 독립이라는 뜻이다.데세트 파송(De cette fa çon), 노트 오라(notre classe n'aura)에 책임감(la Responsibilité De l'instancier)을 더한다.Rien de bien Compliué.
public class MaClasse
{
private readonly MaDepdendance _maDependance;
// dépendance injectée via la constructeur
MaClasse(MaDependance maDependance)
{
_maDependance = maDependance ?? throw new ArgumentNullException("Un message bien senti !");
}
}
Mieux mais pas 무서워요.우리의 생활은 문제로 가득 차 있다.거꾸로 l'instant, toujours pas de dé couplage ou de modularit é dans le code.Dépendons de l'abstraction au liue de l'implementation
Pour faire mieux,nous allons appigure stricto sensu le principle d'inversion de contrôle:dépendre d'abstraction au liu d'implementation.
public class MaClasse
{
private readonly IMaDependance _maDependance;
// On injecte une abstraction (interface) au lieu d'une implémentation concrète
MaClasse(IMaDependance maDependance)
{
_maDependance = maDependance ?? throw new ArgumentNullException("Un message bien senti !");
}
}
뭐 공부 해요?Le“I”pourinterface
?Ce n'est bien entendu qu'une convention de nommage,mais en réalitéil s'est passéceci:
// interface décrivant les membres à implémenter
public interface IMaDependance
{
MaMethode();
}
// MaDependance implémente désormais l'interface IMaDependance
public class MaDependance : IMaDependance
{
public void MaMethode()
{
// implémentation de l'interface
}
}
Au liue de passer directement l'implementation concerète de la dépendence,nous avons passéson abstraction.조트!좀 쉬어.Sans l'aide d'un framework qui feraitça dynamiquement,il reste nécessaire de passer explicitement les dépendances au constructure de notre classe lors de son instancement.
이중 문제:
Ajoutons une implementation par défaut
Pour ajoter une implementation Pour défaut,nous allons simplement tirr parti du mot clé
this
Appliqueéau constructure de la classe.this
permet,en effet,d'appeler un constructureápartir d'un autre constructure.public class MaClasse
{
private readonly IMaDependance _maDependance;
// Constructeur acceptant un argument
MaClasse(IMaDependance maDependance)
{
_maDependance = maDependance ?? throw new ArgumentNullException("Un message bien senti !");
}
// Constructeur vide, qui par appelle l'autre constucteur avec 'this'
MaClasse() : this(new MaDepdendance()){}
}
De cette manière,le constructure vide appellera systemématiquement le constructur ayant la dépendance en argument en lui passant une implementation concerète.Nous obtenons donc deux manières d'instancier notre classe:
this
du langage C#C'est bien,mais il subiste un problème:l'implementation par défaut est instanceciée en dur dans le code:
MaDependance
.Prenons une bonne ré 솔루션
Avec Xamarin.형식nul besoin de chercher très loin,le
DependencyService
jouera ce r ôle á merveille.A strictement parler, le
DependencyService
sert surtout à la résolution d'implémentations natives (dans les projets iOS, Android...) pour les utiliser dans le projet commun Xamarin.Forms.
En pratique, cela fonctionne très bien pour résoudre n'importe quel type.
Le
DependencyService
expose principalement trois méthodes:Register
、Get
etResolve
.Register
ne souffre pas d'ambiguïté,c'est ici que nous enregistrerons notre implementation par défaut.Pour la simplicitéde la démonstration,et parce qu'en pratique ce sera souvent le cas,je prends la classe
App.xaml.cs
comme point d'entrée Pour enregistrer mes dépendences.public partial class App : Application
{
public App()
{
InitializeComponent();
// On enregistre le type MaDependance pour l'interface IMaDependance
DependencyService.Register<IMaDependance, MaDependance>();
MainPage = new MainPage();
}
//[...]
}
Faites comme vous voulez,ce qui est important c'est de bien enregister les types avant toute use duDependencyService
dans le code,cela va de soi.Get
etResolve
semblent fonctionner de manière identique,cependant la documentation affichée e dans Visual Studio nuancequelque peu leur 사용법:_Resolve: 종속성을 유형별로 해석하는 방법
Get: 유형 T의 플랫폼별 구현을 되돌려줍니다_
Resolve
semble mieux correspondreánotre besoin.public class MaClasse
{
private readonly IMaDependance _maDependance;
MaClasse(IMaDependance maDependance)
{
_maDependance = maDependance ?? throw new ArgumentNullException("Un message bien senti !");
}
// On résoud le type avec le DependencyService
MaClasse() : this(DependencyService.Resolve<IMaDependance>()){}
}
Désormais,notre classe ne Dépend plus D'aucune implication concerète,elle n'est plus qu'abstraction!Imagations que de nombreuses classes dépendent de
IMaDependance
et qu'on ait besoin de changer l'implementation de la dépendence partout dans le code,il suffira de remplacer l'implementation enregistreée dansDependencyService.Register
.Pour le reste,ça n'a pas change:Pour injecter une implementation différente il est nécessaire d'instancier la classe en passant explicitement la dépendence dans le constructure.Ce sera notamment le cas pour les simulares crésáfin de tests unitaires.
결론
Si l'inversion de contrôle est souvent confondue avec le framework qui la met en oeuvre,il s'agit en réalitéd'un principleálénoncéplutôtôt simple:une classe doit dépendre d'abstractions et non d'implementation.
Et dans les cas simples,on peut l'appliker sans framework Et profiter de ses avantagesámoindre frais:découplage,modularité,testabilité.
Je vous en ai présentéici une façon fort simpleábase d’
interface
,d'appeláun constructureur par défaut avec le mot cléthis
et duDependencyService
de Xamarin.형식Pour un projet mobile, c'est souvent largement suffisant !
Le 코드 소스
Comme toujours,un petit projet d'Example sur monGitHub.Celui ci est minimaliste:un service,un ViewModel et un test unitaire.아들 seul intér êt est de dé montrer le fonctionnement de tout cela de fa çon un peu moins thé orique.
Sylvain Moingeon 회사 / DITheEasyWayDemo
프로젝트 수반물 주입 의존성
DITheEasyWayDemo
Projet d'Accomagment pour mon article concernantl'inversion de dépendance sous Xamarin.Forms
View on GitHub
뭐 공부 해요?
Reference
이 문제에 관하여(L'inversion de dédependance facile(et pas chère)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/sylvainmoingeon/l-inversion-de-dependance-facile-et-pas-chere-51oe
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(L'inversion de dédependance facile(et pas chère)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/sylvainmoingeon/l-inversion-de-dependance-facile-et-pas-chere-51oe텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)