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 հավելվածներում՝ կախվածությունների կառավարման և կոդի կառուցվածքի համար: