Sobes.tech
Middle

IoC контейнерлери эмне жана алар C# өнүктүрүүдө кандай роль ойнойт?

sobes.tech AI

AIден жооп

IoC (Ийгиликке каршы көзөмөлдөө) контейнерлери — бул каркас түрлөрү, алар тиркемедеги объекттердин жашоо цикли жана көзкарандылыктарын башкарат. Алар көзкарандылыкты башкаруунун тескери принцибин ишке ашырат, объекттерди түзүү жана башкаруу функцияларын контейнерге жүктөп, ал эми бул объекттерди колдонгон коддон эмес.

C#да иштеп чыгууда ролу:

  1. Көзкарандылыктарды башкаруу: IoC контейнерлери автоматтык түрдө көзкарандылыктарды (башка объекттер, аларга көзкарандылык бар объекттер) алардын түзүлүшүндө киргизет. Бул көзкарандылыктарды кол менен түзүү жана өткөрүп берүү зарылдыгын жоготот.
    // IoC жок
    public class MyService
    {
        private readonly IDependency _dependency;
    
        public MyService()
        {
            _dependency = new ConcreteDependency(); // Кол менен көзкарандылыкты түзүү
        }
    }
    
    // IoC менен
    public class MyService
    {
        private readonly IDependency _dependency; // Контейнер аркылуу киргизилет
    
        public MyService(IDependency dependency) // Куруучу аркылуу көзкарандылыкты киргизүү
        {
            _dependency = dependency;
        }
    }
    
  2. Көзкарандылыктарды ажыратуу (decoupling): IoC контейнерлери жогорку деңгээлдеги модулдарды төмөнкү деңгээлдеги модулдардан бөлүп, алсыз байланыштуулукка көмөктөшөт. Класстар абстракциялардан (интерфейстерден) көзкарандылыктарга ээ, конкреттүү ишке ашырууларга эмес. Контейнер абстракцияны керектүү ишке ашырууга байланыштырат.
  3. Тестирлөөнү жеңилдетүү: Көзкарандылыктар сырттан киргизилгендиктен, мок-объекттерди же тоскоолдуктарды бирдиктүү тесттер жазууда оңой алмаштырып колдонууга болот.
  4. Жашоо циклин башкаруу: Контейнер объекттердин мисалдарын түзүү жолун башкаруу мүмкүнчүлүгүнө ээ (мисалы, ар дайым жаңы, колдонмо үчүн бир мисал (синглтон), суранычка бир мисал жана башка).
    // Контейнердеги конфигурациянын мисалы (абстракция, фреймворкка жараша айырмаланышы мүмкүн)
    //builder.RegisterType<ConcreteDependency>().As<IDependency>().SingleInstance(); // Синглтон
    //builder.RegisterType<ConcreteDependency>().As<IDependency>().InstancePerDependency(); // Ар жолу жаңы
    
  5. Конфигурация жана кеңейтүү мүмкүнчүлүгү: Абстракциялар менен ишке ашыруулар ортосундагы байланышты конфигурациялоо өзүнчө жайга чыгарылышы мүмкүн, бул тиркеменин жүрүм-турумун өзгөртүүнү жеңилдетет, негизги кодду өзгөртүүнүн кажети жок.

C# экосистемасында популярдуу IoC контейнерлери: Autofac, Ninject, StructureMap (устарган), Unity, Microsoft.Extensions.DependencyInjection (жасалган .NET Core жана .NET 5+ үчүн).