Middle+
Koji mehanizmi pomažu u poštivanju principa inverzije zavisnosti?
sobes.tech АИ
Одговор од АИ
Princip inverzije zavisnosti (Dependency Inversion Principle - DIP) se sprovodi pomoću nekoliko međusobno povezanih mehanizama:
-
Apstrakcije:
- Interfejsi i apstraktne klase definišu ugovore, a ne konkretne implementacije. Moduli visokog nivoa zavise od ovih apstrakcija, a ne od niskonivojskih konkretnih klasa.
-
**Umetanje zavisnosti (Dependency Injection - DI):
- Umesto da klasa direktno kreira svoje zavisnosti, one joj se prosleđuju spolja. Ovo omogućava lako zamenjivanje implementacija zavisnosti bez promene koda same klase.
- C# sintaksa za injektovanje putem konstruktora:
public class HighLevelModule { private readonly ILowLevelDependency _dependency; // Zavisnost od apstrakcije public HighLevelModule(ILowLevelDependency dependency) // Injektovanje putem konstruktora { _dependency = dependency; } public void PerformAction() { _dependency.Execute(); // Korišćenje zavisnosti putem apstrakcije } } - C# sintaksa za injektovanje putem svojstva:
public class AnotherHighLevelModule { public ILowLevelDependency Dependency { get; set; } // Injektovanje putem svojstva public void PerformAction() { Dependency?.Execute(); // Korišćenje zavisnosti putem apstrakcije } } - C# sintaksa za injektovanje putem metode:
public class YetAnotherHighLevelModule { public void PerformAction(ILowLevelDependency dependency) // Injektovanje putem metode { dependency.Execute(); // Korišćenje zavisnosti putem apstrakcije } }
-
**IoC kontejnere (Inversion of Control Containers):
- Okviri koji automatizuju proces upravljanja zavisnostima i injektovanjem. Oni su zaduženi za kreiranje instanci klasa i rešavanje njihovih zavisnosti prema podešenim pravilima.
- Primer korišćenja popularnog IoC kontejnera (npr. StructureMap):
// Registracija zavisnosti // container.Configure(cfg => // { // cfg.For<ILowLevelDependency>().Use<ConcreteLowLevelDependency>(); // Registracija apstrakcije i njene konkretne implementacije // cfg.For<HighLevelModule>().Use<HighLevelModule>(); // }); // Dobijanje instance klase sa rešenim zavisnostima // var highLevelModule = container.GetInstance<HighLevelModule>(); // highLevelModule.PerformAction();
-
Fabrike:
- Klase koje su zadužene za kreiranje instanci drugih klasa. One mogu skrivati detalje kreiranja konkretnih implementacija i vraćati apstrakcije.
- C# sintaksa za primer korišćenja fabrike:
public interface ILowLevelDependencyFactory { ILowLevelDependency Create(); } public class LowLevelDependencyFactory : ILowLevelDependencyFactory { public ILowLevelDependency Create() { return new ConcreteLowLevelDependency(); // Kreiranje konkretne implementacije } } public class HighLevelModuleWithFactory { private readonly ILowLevelDependency _dependency; public HighLevelModuleWithFactory(ILowLevelDependencyFactory factory) // Injektovanje fabrike { _dependency = factory.Create(); // Korišćenje fabrike za kreiranje zavisnosti } public void PerformAction() { _dependency.Execute(); } }
-
Zakon najmanjih znanja (Law of Demeter):
- Iako nije direktan mehanizam DIP, pridržavanje ovog principa (govoriti samo sa svojim neposrednim "prijateljima") često dovodi do smanjenja direktnih zavisnosti i olakšava primenu DIP.