Sobes.tech
Middle+

Πώς να παρέχετε διαφορετικές περιπτώσεις της ίδιας κλάσης στο Dagger Hilt;

sobes.tech AI

Απάντηση από AI

Για την παροχή διαφορετικών στιγμιότυπων της ίδιας κλάσης στο Dagger Hilt, μπορείτε να χρησιμοποιήσετε προσδιοριστές (@Named ή προσαρμοσμένους).

  1. Δημιουργία προσδιοριστών:

    • Χρησιμοποιήστε το @Named για απλές περιπτώσεις, καθορίζοντας ένα όνομα συμβολοσειράς.
    • Δημιουργήστε τις δικές σας προσαρμοσμένες αναφορές προσδιοριστών για πιο πολύπλοκα σενάρια ή καλύτερη σημασιολογία.
    // Παράδειγμα προσαρμοσμένου προσδιοριστή
    @Qualifier
    @Retention(AnnotationRetention.RUNTIME)
    annotation class ProductionApi
    
    @Qualifier
    @Retention(AnnotationRetention.RUNTIME)
    annotation class TestApi
    
  2. Δέσμευση διαφορετικών στιγμιότυπων με χρήση προσδιοριστών:

    • Στα modules του Hilt (@Module), μέσα σε κλάσεις με @Provides ή @Binds, χρησιμοποιήστε τις αναφορές προσδιοριστών σε μεθόδους που επιστρέφουν στιγμιότυπα.
    @Module
    @InstallIn(SingletonComponent::class) // Παράδειγμα scope
    object AppModule {
    
        @Provides
        @Singleton // Παράδειγμα scope
        @Named("개발") // Προσδιοριστής @Named για το στιγμιότυπο "Για ανάπτυξη"
        fun provideDevRepository(): Repository {
            return Repository("Περιβάλλον ανάπτυξης") // Διαφορετικό στιγμιότυπο ή διαμόρφωση
        }
    
        @Provides
        @Singleton // Παράδειγμα scope
        @Named("운영") // Προσδιοριστής @Named για το στιγμιότυπο "Για παραγωγή"
        fun provideProdRepository(): Repository {
            return Repository("Περιβάλλον παραγωγής") // Διαφορετικό στιγμιότυπο ή διαμόρφωση
        }
    
        // Χρήση προσαρμοσμένων προσδιοριστών
        @Provides
        @Singleton
        @ProductionApi
        fun provideProductionService(): MyService {
            return MyService("Τέλος σημείου API παραγωγής")
        }
    
        @Provides
        @Singleton
        @TestApi
        fun provideTestService(): MyService {
            return MyService("Τέλος σημείου API δοκιμής")
        }
    }
    
  3. Εγχυση συγκεκριμένου στιγμιότυπου:

    • Στα σημεία όπου χρειάζεται να γίνει η εξάρτηση (@AndroidEntryPoint), σημειώστε το πεδίο ή τον παράμετρο του κατασκευαστή με τον κατάλληλο προσδιοριστή.
    @AndroidEntryPoint // Για παράδειγμα, Fragment ή Activity
    class MyFragment : Fragment() {
    
        @Inject
        @Named("개발") // Εγχύει το στιγμιότυπο "Για ανάπτυξη"
        lateinit var devRepository: Repository
    
        @Inject
        @Named("운영") // Εγχύει το στιγμιότυπο "Για παραγωγή"
        lateinit var prodRepository: Repository
    
        @Inject
        @ProductionApi // Εγχύει το στιγμιότυπο για παραγωγή με προσαρμοσμένο προσδιοριστή
        lateinit var productionService: MyService
    
        // ... χρήση των εξαρτήσεων ...
    }