Swinject: bu nədir, Dependency Injection prinsipləri və necə işləyir

Müəllif: IT Sectr Dərc olunub: 2026-05-04 Oxuma vaxtı: 8 dəq

Swinject — iOS tətbiqlərində Dependency Injection nümunəsini həyata keçirən Swift üçün DI konteyneridir. Framework asılılıqların yaradılması və tətbiqini avtomatlaşdırır, obyektlərin və fabriklərin əl ilə idarə edilməsini aradan qaldırır. GitHub-da Swinject məlumatlarına görə, kitabxana Constructor Injection, Property Injection və Method Injection-u çevik scope sistemi ilə dəstəkləyir.

Əsas məqamlar

  • Swinject — iOS layihələrində asılılıqların tətbiqini avtomatlaşdıran Swift üçün DI konteyneri.
  • Dependency Injection — obyektin asılılıqları öz daxilində yaratmaq əvəzinə kənardan aldığı nümunə.
  • Container — Swinject-in mərkəzi komponenti, qeydiyyatdan keçmiş xidmətlərin və onların fabriklərinin reyestrini saxlayır.
  • Service — protokol şəklində abstraksiya, konteyner onun üçün konkret tətbiqi saxlayır.
  • ObjectScope — nümunənin ömür müddətini təyin edən mexanizm: graph, container və ya transient.

Swinject və Dependency Injection nədir

Swinject — iOS, macOS və watchOS üçün tətbiqlərdə asılılıqların tətbiqini sadələşdirmək üçün hazırlanmış Swift dili üçün açıq mənbəli DI konteyneridir. Framework Service Locator yanaşmasından istifadə edir: xidmətlər mərkəzi konteynerdə qeydiyyatdan keçirilir və konteyner nümunə tələb edildikdə asılılıq qrafını avtomatik həll edir.

Dependency Injection (DI) — obyektin asılılıqlarını öz daxilində yaratmaq əvəzinə kənardan aldığı dizayn nümunəsidir. Bu, komponentlər arasında bağlılığı azaldır, modul testini sadələşdirir və istehlakçı kodunu dəyişmədən tətbiqləri əvəz etməyə imkan verir.

Martin Fowler-ə (2004) görə, DI Inversion of Control-ün xüsusi bir halıdır və konstruktor, xüsusiyyət və ya metod vasitəsilə tətbiq edilir. Swinject bu prosesi avtomatlaşdırır, fabriklərin və xidmət lokatorlarının əl ilə yazılmasını aradan qaldırır.

Swinject-i üç və daha çox kəsişən asılılıqları olan xidmətləri olan layihələrdə tətbiq edin, burada obyektlərin əl ilə qurulması inisializasiya kodunun böyüməsinə və test edilə bilmənin azalmasına səbəb olur.

Swinject Apple ekosistemi ilə sıx inteqrasiya olunur və Swift 3.0-dan başlayaraq bütün versiyalarını dəstəkləyir. Framework Objective-C ilə körpülər vasitəsilə uyğun gəlir ki, bu da onu qarışıq dildə yazılmış mövcud layihələrə kodun tam miqrasiyası olmadan tətbiq etməyə imkan verir. Bu, xüsusilə beş ildən çox inkişaf tarixi olan böyük tətbiqlər üçün aktualdır.

Swinject konteyneri necə işləyir

Swinject konteyneri Container sinfi ilə həyata keçirilir və qeydiyyatdan keçmiş xidmətlərin reyestrini saxlayır. resolve metoduna müraciət edildikdə, konteyner obyekt yaradır və onun bütün asılılıqlarını qeydiyyat qrafı üzrə rekursiv şəkildə həll edir.

Container və Service

Container — abstraksiya ilə onun tətbiqi arasında uyğunluqların qeydiyyatdan keçirildiyi mərkəzi obyektdir. Service — müqaviləni müəyyən edən protokol, Component isə bu protokolu həyata keçirən sinifdir. Qeydiyyat xidmət növünü və fabriki qəbul edən register metodu ilə yerinə yetirilir.

swift
let container = Container()
container.register(Networking.self) { _ in
    NetworkService()
}
let service = container.resolve(Networking.self)

resolve metodu göstərilən protokol üçün qeydiyyatdan keçmiş konkret tətbiqin nümunəsini qaytarır. Asılılıq qeydiyyatdan keçməyibsə, konteyner inkişaf mərhələsində problemin sürətli aşkarlanması üçün kritik səhv verir.

Registration və adlandırılmış xidmətlər

Hər qeydiyyat fabrik funksiyası və seçilmiş scope ilə bir giriş yaradır. Bir xidmətin müxtəlif adlarla bir neçə qeydiyyatı ola bilər ki, bu da müxtəlif mühitlər (development, staging, production) üçün faydalı olan adla konkret tətbiqi seçməyə imkan verir.

Asılılıqların həlli prosesi (resolution) rekursiv işləyir: konteyner Component nümunəsini yaratdıqda, onun inisializatorunu təhlil edir və hər bir parametr üçün müvafiq növün resolve-ni çağırır. Asılılığın da öz asılılıqları varsa, proses bütün qraf tam qurulana qədər davam edir. Yuvarlanma dərinliyi yalnız mövcud yaddaşla məhdudlaşır, lakin praktikada nadir hallarda beş səviyyəni keçir.

Swinject-də asılılıqların tətbiqi üsulları

Swinject asılılıqların tətbiqinin üç əsas üsulunu dəstəkləyir, hər biri memarlıq kontekstindən asılı olaraq tətbiq edilir.

Constructor Injection

Constructor Injection — inisializator parametrləri vasitəsilə asılılıqların tətbiqi. Bu, obyektin yaradıldığı andan etibarən həmişə düzgün vəziyyətdə olmasını təmin edən üstünlük verilən üsuldur. Swinject konstruktora ötürülən bütün asılılıqları avtomatik həll edir.

swift
class LoginViewModel {
    private let authService: AuthProtocol

    init(authService: AuthProtocol) {
        self.authService = authService
    }
}

container.register(AuthProtocol.self) { _ in
    AuthService()
}
container.register(LoginViewModel.self) { r in
    LoginViewModel(authService: r.resolve(AuthProtocol.self)!)
}

Property Injection

Property Injection — obyektin inisializasiyasından sonra xüsusiyyətlərinin təyin edilməsi ilə tətbiq. Asılılıq opsional olduqda və ya konstruktor vasitəsilə ötürülə bilmədikdə, məsələn, view controller-in avtomatik yaradıldığı Storyboard ilə işləyərkən istifadə olunur. Swinject resolve-nin açıq çağırışı olmadan xüsusiyyətlərin avtomatik tətbiqi üçün @Inject annotasiyasını dəstəkləyir.

Property Injection istifadə edərkən, asılılığın obyektə ilk müraciətdən əvvəl təyin edildiyinə əmin olmaq vacibdir. Əks halda, xüsusiyyət nil qalacaq və bu, gözlənilməz crash-a səbəb olacaq. Swinject bu problemi Implicitly Unwrapped Optional mexanizmi və asılılıq qrafının həlli mərhələsində ciddi yoxlama vasitəsilə həll edir.

Method Injection

Method Injection — metod parametrləri vasitəsilə tətbiq. Yalnız bir əməliyyatı yerinə yetirmək üçün lazım olan və obyektin daimi vəziyyəti kimi saxlanmamalı olan xidmətlər üçün tətbiq edilir. Bu, ən az yayılmış, lakin callback üçün faydalı tətbiq üsuludur.

Swinject-də scopelər və onların təyinatı

ObjectScope — Swinject konteyneri daxilində yaradılan nümunənin ömür müddətini təyin edən mexanizmdir. Framework ObjectScopeProtocol protokolu vasitəsilə xüsusi scopelər yaratmaq imkanı ilə üç daxili scope təqdim edir.

ObjectScope.graph

graph scope — standart dəyər. Hər resolve çağırışında yeni nümunə yaradılır və yalnız asılılıq qrafının həlli müddəti ərzində yaşayır. Bu, keşləmə səbəbindən yaddaş sızmalarını aradan qaldırdığı üçün vəziyyətsiz xidmətlər üçün təhlükəsiz seçimdir.

ObjectScope.container

container scope — konteyner daxilində singleton. Nümunə ilk resolve zamanı bir dəfə yaradılır və bütün sonrakı sorğularda qaytarılır. Ümumi vəziyyəti olan xidmətlər üçün uyğundur: məlumat keşi, logger, tətbiq parametrləri.

ObjectScope.transient

transient scope — hər resolve çağırışı keşləmə olmadan yeni nümunə yaradır. Təkrar istifadə edilməsi lazım olmayan yüngül obyektlər üçün istifadə olunur — məsələn, konkret HTTP sorğusu ilə işləmək modulları üçün.

ScopeÖmür müddətiTövsiyə olunan tətbiq
graphQrafın həlli müddəti ərzindəStandart olaraq vəziyyətsiz xidmətlər
containerKonteynerin bütün ömrü boyuSingleton: keş, logger, şəbəkə müştərisi
transientKeşləmə olmadanBirdəfəlik istifadə üçün yüngül obyektlər

iOS layihələrində Swinject

Swinject-in real iOS layihəsinə inteqrasiyası tətbiqin başlanğıcında — AppDelegate və ya səhnədə konteynerin inisializasiyası ilə başlayır. Qeydiyyatların Assembly vasitəsilə strukturlaşdırılması tövsiyə olunur: əlaqəli xidmətləri qruplaşdıran ayrıca sinif və ya struktur.

Swift Developer Community sorğusuna (2025) görə, iOS tərtibatçılarının 43%-i kommersiya layihələrində şəbəkə qatının, depozitoriyaların və naviqasiya koordinatorlarının asılılıqlarını idarə etmək üçün DI konteynerlərindən istifadə edir. Swinject minimal sintaksis və Objective-C ilə uyğunluq sayəsində ən populyar həll olaraq qalır.

Storyboard Injection — Swinject-in unikal imkanı: konteyner Storyboard-dan yaradılan view controller-lərə AppDelegate-də əlavə kod olmadan avtomatik asılılıqlar tətbiq edir. Bunun üçün UIStoryboard-a init(container:) metodu vasitəsilə ötürülən xüsusi resolver istifadə olunur ki, o da view controller-in yaradılmasını ələ keçirir və qeydiyyatdan keçmiş asılılıqları tətbiq edir.

Böyük layihələrdə Swinject naviqasiya koordinatorları ilə birləşdirilə bilər: koordinator konteyneri alır və ekranları yaradır, onların asılılıqlarını resolve vasitəsilə həll edir, bu da bütün səhnə üçün vahid konfiqurasiya nöqtəsini qoruyur.

Assembly ilə arxitektura — qeydiyyatların təşkili üçün tövsiyə olunan nümunədir. Hər Assembly əlaqəli xidmətləri qruplaşdırır (məsələn, NetworkingAssembly, DatabaseAssembly) və digər Assembly-lərdən asılı ola bilər. Konteynerin inisializasiyası zamanı bütün Assembly-lər yüklənir və öz xidmətlərini qeydiyyatdan keçirir ki, bu da məsuliyyətlərin aydın bölünməsini təmin edir və onlarla xidməti olan böyük layihələrdə DI konfiqurasiyasında naviqasiyanı sadələşdirir.

DI qrafının sazlanması üçün Swinject plist faylından konfiqurasiya yükləyən SwinjectPropertyLoader genişləndirməsini və UIStoryboard-ın xüsusi versiyası vasitəsilə storyboard-larla inteqrasiya üçün SwinjectStoryboard təqdim edir. Bu alətlər xüsusilə mövcud layihənin əl ilə obyekt qurulmasından DI-ya köçürülməsi mərhələsində faydalıdır: tərtibatçı tədricən xidmətləri qeydiyyatdan keçirə, testlər və həll səhvlərinin loqlanması vasitəsilə asılılıq qrafını yoxlaya, tətbiqin əsas funksiyalarının inkişafını dayandırmadan.

Swinject həmçinin RxSwift və Combine ilə fabriklərin açıq qeydiyyatı olmadan inisializator parametrlərinin növləri üzrə asılılıqların avtomatik həlli üçün SwinjectAutoregistration genişləndirməsi vasitəsilə inteqrasiya təmin edir. Bu, sadə xidmətlər üçün qeydiyyat kodunun həcmini azaldır: fabriki göstərmədən container.register(ServiceProtocol.self) çağırmaq kifayətdir və Swinject Swift icra mühiti tərəfindən təmin edilən Signal refleksiyası əsasında fabriki müstəqil quracaq. Bu yanaşma konstruktoru yalnız əsas növləri qəbul edən və yaradılarkən mürəkkəb məntiq tələb etməyən xidmətlər üçün tövsiyə olunur.

Tez-tez verilən suallar

Swinject digər DI freymvorklarından nə ilə fərqlənir?

Swinject kod generasiyası və refleksiya olmadan təmiz Swift-də yazılmışdır. Needle-dən fərqli olaraq, mənbə kodu generasiyası tələb etmir, Dip ilə müqayisədə isə daxili Storyboard Injection dəstəyi təmin edir ki, bu da mövcud UIKit layihələrinə inteqrasiyanı asanlaşdırır.

Swinject-i Swift Package Manager vasitəsilə necə quraşdırmaq olar?

Paketi github.com/Swinject/Swinject URL-i ilə Xcode-da File — Add Packages menyusu vasitəsilə əlavə edin. CocoaPods və Carthage vasitəsilə quraşdırma da mövcuddur. Quraşdırmadan sonra Swinject modulunu idxal edin və Container nümunəsi yaradın.

Swinject-i SwiftUI layihələrində istifadə etmək olarmı?

Bəli, Swinject SwiftUI ilə tam uyğundur. Asılılıqlar View inisializatorları və ya Environment vasitəsilə tətbiq edilir, burada konteyner EnvironmentObject kimi ötürülür. Swinject UIKit-dən asılı deyil və hər iki freymvorkla eyni şəkildə işləyir.

Swinject-i modul testi üçün necə tətbiq etmək olar?

Testlər üçün ayrıca konteyner yaradın, real xidmətləri mock-larla əvəz edin. Swinject istehlakçıların kodunu dəyişmədən qeydiyyatları ləğv etməyə imkan verir. Hər test minimal asılılıq dəsti olan izolyasiya edilmiş konteyner alır.

Analitika xidməti üçün hansı scope seçilməlidir?

Analitika üçün container scope-dan istifadə edin ki, bütün ekranlar hadisələri bir nümunə vasitəsilə göndərsin. Bu, vahid göndərmə növbəsini və müxtəlif istehlakçılar arasında məlumatların təkrarlanmadan düzgün batch aqreqasiyasını təmin edir.

Nəticə

  • Swinject — Container və ObjectScope vasitəsilə asılılıqların tətbiqini avtomatlaşdıran Swift üçün DI konteyneri.
  • Dependency Injection kodun bağlılığını azaldır, testi sadələşdirir və istehlakçıları dəyişmədən tətbiqləri əvəz etməyə imkan verir.
  • Container — qeydiyyat üçün register və nümunə əldə etmək üçün resolve dəstəkləyən xidmətlər reyestri.
  • Constructor Injection — obyektin düzgün vəziyyətinə zəmanət verən üstünlük verilən tətbiq üsulu.
  • ObjectScope ömür müddətini idarə edir: graph (standart), container (singleton) və transient (keşsiz).
  • Storyboard Injection əl konfiqurasiyası olmadan UIKit səhnələrinə avtomatik asılılıqlar tətbiq edir.
  • Modul testləri üçün xidmətlərin mock tətbiqləri ilə ayrıca konteynerdən istifadə edin.

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun