Sobes.tech
Middle

Խոսեք Dagger շրջանակի մասին։

sobes.tech AI

Պատասխան AI-ից

Dagger-ը ֆրեյմվորկ է կախվածությունների ներդրման (dependency injection, DI) համար Java և Android-ում: Այն հիմնված է JSR-330 հատուկեցության վրա: Dagger V2 օգտագործում է կոդի սերնդում՝ կոմպիլյացիայի ժամանակ, ինչը բացառում է ժամանակի ընթացքում ռեֆլեկտիվ DI-ֆրեյմվորկների բնորոշ ծախսերը:

Dagger-ի հիմնական հասկացությունները՝

  • Մոդուլներ (@Module)՝ Կլասեր, որոնք ապահովում են կախվածություններ: Ներքևում, @Provides նշած մեթոդները վերադարձնում են օբյեկտների օրինակներ, որոնք Dagger-ը կարող է ներդնել:
@Module
public class AppModule {
    @Provides
    Context provideAppContext(Application app) {
        return app.getApplicationContext();
    }
}
  • Կոմպոնենտներ (@Component)՝ Ինտերֆեյսներ, որոնք կապում են մոդուլները և ներդրման վայրերը: Նրանք պարունակում են մեթոդներ, որոնք վերադարձնում են կախվածությունների օրինակներ կամ ներդրման մեթոդներ (void inject(Target target);):
@Component(modules = AppModule.class)
public interface AppComponent {
    Context getAppContext();
    void inject(MyApplication application); // Ներդրման մեթոդ
}
  • Ներդրում (@Inject)՝ Անոտացիա, որը ցույց է տալիս Dagger-ին, որտեղ պետք է տրամադրել կախվածությունը: Կարող է կիրառվել կոնստրուկտորների, դաշտերի և մեթոդների վրա:
public class UserManager {
    private final UserRepository userRepository;

    @Inject // Ներդրում կոնստրուկտորով
    public UserManager(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    // ...
}

public class MainActivity extends AppCompatActivity {
    @Inject // Ներդրում դաշտով
    UserManager userManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // ...
        // Կոմպոնենտի ստացում և կախվածությունների ներդրում
        ((MyApplication) getApplication()).getAppComponent().inject(this);
    }
}
  • Տիրույթ (@Singleton, @Scope)՝ Անոտացիաներ, որոնք սահմանում են տրամադրվող կախվածությունների կյանքի տևողությունը: Դեպի default՝ @Singleton, բայց կարող են ստեղծվել սեփական տիրույթի նշումներ:
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface PerActivity {}

@PerActivity
@Component(modules = ActivityModule.class, dependencies = AppComponent.class)
public interface ActivityComponent {
    void inject(MainActivity activity);
}

Dagger-ի առավելությունները՝

  • Արդյունավետություն՝ Կոդի սերնդում՝ կոմպիլյացիայի ժամանակ, նվազեցնում է ժամանակի ընթացքում ծախսերը:
  • Տիպային անվտանգություն՝ Վահանակների սխալները հայտնաբերվում են կոմպիլյացիայի ժամանակ:
  • Ստուգելիություն՝ Dagger-ի սերունդը կոդը ընթեռնելի է:
  • Հեշտ թեստավորում՝ Վահանակները հեշտությամբ փոխարինվում են մոկերով:

Նշաններ՝

  • Շատ բարձր ուսուցման գրաֆիկ:
  • Որոշ դեպքերում՝ բարդ սինտաքսիս:
  • Կոմպիլյացիայի ժամանակի ավելացում:

Dagger-ը ակտիվորեն օգտագործվում է մեծ Android հավելվածներում՝ կախվածությունների կառավարման և կոդի կառուցվածքի համար: