Sobes.tech
Middle

Kas yra IoC konteineriai ir kokią vaidmenį jie atlieka C# kūrime?

sobes.tech AI

Atsakymas iš AI

IoC (Inversion of Control) konteineriai yra karkasai, kurie valdo objektų gyvavimo ciklą ir priklausomybes programoje. Jie įgyvendina valdymo atvirkštinio principą, deleguodami objektų kūrimą ir valdymą konteineriui, o ne kodui, kuris šiuos objektus naudoja.

Vaidmuo C# kūrime:

  1. Priklausomybių valdymas: IoC konteineriai automatiškai įdiegia priklausomybes (kitas objektus, nuo kurių priklauso duotas objektas) jo sukūrimo metu. Tai pašalina poreikį rankiniu būdu kurti ir perduoti priklausomybes.
    // Be IoC
    public class MyService
    {
        private readonly IDependency _dependency;
    
        public MyService()
        {
            _dependency = new ConcreteDependency(); // Rankinis priklausomybės kūrimas
        }
    }
    
    // Su IoC
    public class MyService
    {
        private readonly IDependency _dependency; // Priklausomybė bus įdiegta konteineryje
    
        public MyService(IDependency dependency) // Konstruktoriumi įdiegti priklausomybę
        {
            _dependency = dependency;
        }
    }
    
  2. Priklausomybių atskyrimas (decoupling): IoC konteineriai padeda atskirti aukšto lygio modulius nuo žemo lygio, skatinant silpną ryšį. Klasės priklauso nuo abstrakcijų (sąsajų), o ne nuo konkrečių įgyvendinimų. Konteineris atsakingas už abstrakcijos sujungimą su reikiamu įgyvendinimu.
  3. Testavimo supaprastinimas: Kadangi priklausomybės įdiegiamos iš išorės, jas lengva pakeisti su mok-objektais ar uždangalais rašant vienetinius testus.
  4. Gyvenimo ciklo valdymas: Konteineris gali valdyti, kaip kuriami objektų pavyzdžiai (pvz., kiekvieną kartą naujas, vienas pavyzdys programai (singltonas), vienas užklausai ir kt.).
    // Konfigūracijos pavyzdys konteineryje (abstrakcija, gali skirtis tarp karkasų)
    //builder.RegisterType<ConcreteDependency>().As<IDependency>().SingleInstance(); // Singltonas
    //builder.RegisterType<ConcreteDependency>().As<IDependency>().InstancePerDependency(); // Kiekvieną kartą naujas
    
  5. Konfigūracija ir išplėtimas: Priklausomybių ir įgyvendinimų ryšys gali būti atskirtas į atskirą vietą, tai palengvina programos elgesio keitimą be pagrindinio kodo modifikacijos.

Populiarūs IoC konteineriai C# ekosistemoje: Autofac, Ninject, StructureMap (pasenęs), Unity, Microsoft.Extensions.DependencyInjection (įmontuotas .NET Core ir .NET 5+).