Hançer 2 bileşeni (nesne grafiği) ömrü ne belirler?
2, kapsamlı grafikler ömrü özellikle Hançer bulur kafamda bir yere oturtmaya çalışıyorum. Nasıl kapsam çıkarken temizlenecek bir bileşen oluşturun.
Bir Android uygulaması, Hançer kullanma 1 durumunda.x genellikle uzatmak istiyorum hangi uygulama düzeyinde bir kök kapsamında faaliyet düzeyinde bir alt kapsam oluşturmak zorunda.
public class MyActivity {
private ObjectGraph mGraph;
public void onCreate() {
mGraph = ((MyApp) getApplicationContext())
.getObjectGraph()
.plus(new ActivityModule())
.inject(this);
}
public void onDestroy() {
mGraph = null;
}
}
Alt kapsamı bu durumda Etkinliği ömrü olan bir başvuru tuttuğun sürece var. OnDestroy başvuru bırakarak kapsamlı grafik çöplük özgürdü sağlamıştır.
EDİT
Jesse Wilson Son mea culpa a gönderildi
Hançer 1.0 çok kötü kapsam adları berbat ... @Singleton açıklama kök grafikler ve özel grafikler her ikisi için de kullanılır, zor bir şey gerçek kapsamının ne olduğunu anlamak hiç de zor değil.
ve Hançer 2 şekilde geliştirme yolunda/haber puan kapsamları okudum her şey çalışmak, ama aradaki farkı anlamakta güçlük çekiyorum. @Kirill Boyarshinov aşağıda Yorum yok göre, bir bileşen ya da bağımlılık döngüsü hala, her zamanki gibi, somut kaynaklar tarafından belirlenir. Yani Hançer 1 arasındaki fark.x ve 2.0 kapsamları tamamen anlamsal açıklık meselesi?
Benim anlayış
Hançeri 1.x
Bağımlılıklar @Singleton
ya yok edildi ya. Bu kök grafik ve subgraphs bu bağımlılıkları eşit derecede gerçek, bağımlılık bağlı olarak belirsizlik (In Dagger are Singletons within the sub-graph cached or will they always be recreated when a new activity sub-graph is constructed?) önde girdi
Hançer 2.0
Özel kapsamları anlamsal kapsamları net oluşturmak için izin, ama işlevsel @Singleton
uygulayarak eşdeğer Hançeri 1.x.
// Application level
@Singleton
@Component( modules = MyAppModule.class )
public interface MyAppComponent {
void inject(Application app);
}
@Module
public class MyAppModule {
@Singleton @Named("SingletonScope") @Provides
Application provideStringBuilderSingletonScope() {
return new StringBuilder("App");
}
}
// Our custom scope
@Scope public @interface PerActivity {}
// Activity level
@PerActivty
@Component(
dependencies = MyAppComponent.class,
modules = MyActivityModule.class
)
public interface MyActivityComponent {
void inject(Activity activity);
}
@Module
public class MyActivityModule {
@PerActivity @Named("ActivityScope") @Provides
StringBuilder provideStringBuilderActivityScope() {
return new StringBuilder("Activity");
}
@Name("Unscoped") @Provides
StringBuilder provideStringBuilderUnscoped() {
return new StringBuilder("Unscoped");
}
}
// Finally, a sample Activity which gets injected
public class MyActivity {
private MyActivityComponent component;
@Inject @Named("AppScope")
StringBuilder appScope
@Inject @Named("ActivityScope")
StringBuilder activityScope1
@Inject @Named("ActivityScope")
StringBuilder activityScope2
@Inject @Named("Unscoped")
StringBuilder unscoped1
@Inject @Named("Unscoped")
StringBuilder unscoped2
public void onCreate() {
component = Dagger_MyActivityComponent.builder()
.myApplicationComponent(App.getComponent())
.build()
.inject(this);
appScope.append(" > Activity")
appScope.build() // output matches "App (> Activity) "
activityScope1.append("123")
activityScope1.build() // output: "Activity123"
activityScope2.append("456")
activityScope1.build() // output: "Activity123456"
unscoped1.append("123")
unscoped1.build() // output: "Unscoped123"
unscoped2.append("456")
unscoped2.build() // output: "Unscoped456"
}
public void onDestroy() {
component = null;
}
}
Paket @PerActivity
kullanarak iletişim kurarniyetibu bileşen ömrü ile ilgili olabilir, ama sonuçta bileşeni her yerde/her zaman kullanabilirsiniz. Hançerin tek söz, verilen bir bileşen için, kapsam açıklamalı yöntemleri tek bir örneğini döndürür. Ben de bu bileşen kapsamında ek açıklama modülleri tek ya da aynı kapsamda ya da olmayan kapsamlı bağımlılıkları sağlamak doğrulamak için kullanır Hançer 2 varsayalım.
Özet Olarak
Bağımlılıkları hala tek ya da non-singleton ama @Singleton
şimdi uygulama düzeyinde tek örneği ve özel kapsamları daha kısa bir yaşam döngüsü ile tek bağımlılıkları notlar için tercih edilen yöntem için tasarlanmıştır.
Geliştirici sorumlu yönetici yaşam döngüsü bileşenleri/bağımlılıklar tarafından atılan başvurular artık gerekli ve sorumlu sağlanması bileşenleri, sadece oluşturulan bir kere kapsam için hangi onlar tasarlanmış, ama özel kapsam açıklamalar yapmak daha kolay tanımlamak için bu kapsam.
$64 K Soru*
Hançer 2 kapsamları ve ömürleri benim anlayış doğru mu?
* Aslında $64'000 soru.
CEVAP
Sorunuza gelince
Hançer 2 bileşeni (nesne grafiği) ömrü ne belirler?
Kısa cevapbunu belirlemek. Bileşenleri bir kapsam olarak verilebilir
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface ApplicationScope {
}
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface ActivityScope {
}
Bu iki şey için sizin için yararlıdır:
- Kapsam geçerliliği: bir bileşen sadece unscoped sağlayıcıları olabilir, ya da bileşen olarak aynı kapsam sağlayıcıları kapsamlı.
.
@Component(modules={ApplicationModule.class})
@ApplicationScope
public class ApplicationComponent {
Something something();
AnotherThing anotherThing();
void inject(Whatever whatever);
}
@Module
public class ApplicationModule {
@ApplicationScope //application-scoped provider, only one can exist per component
@Provides
public Something something() {
return new Something();
}
@Provides //unscoped, each INJECT call creates a new instance
public AnotherThing anotherThing() {
return new AnotherThing();
}
}
- Alt kapsamı kapsamlı kendi bağımlılıkları için, böylece bir "" "" bileşeni. superscoped sağlanan örneklerini kullanan bir bileşen subscoped oluşturmak için izin verir
Bu @Subcomponent
açıklama, bileşeni ya da bağımlılıkları ile yapılabilir. Ben şahsen bağımlılıkları tercih ederim.
@Component(modules={ApplicationModule.class})
@ApplicationScope
public class ApplicationComponent {
Something something();
AnotherThing anotherThing();
void inject(Whatever whatever);
ActivityComponent newActivityComponent(ActivityModule activityModule); //subcomponent factory method
}
@Subcomponent(modules={ActivityModule.class})
@ActivityScope
public interface ActivityComponent {
ThirdThingy thirdThingy();
void inject(SomeActivity someActivity);
}
@Module
public class ActivityModule {
private Activity activity;
public ActivityModule(Activity activity) {
this.activity = activity;
}
//...
}
ApplicationComponent applicationComponent = DaggerApplicationComponent.create();
ActivityComponent activityComponent = applicationComponent.newActivityComponent(new ActivityModule(SomeActivity.this));
Veya bileşen bağımlılıklar gibi kullanabilirsiniz
@Component(modules={ApplicationModule.class})
@ApplicationScope
public class ApplicationComponent {
Something something();
AnotherThing anotherThing();
void inject(Whatever whatever);
}
@Component(dependencies={ApplicationComponent.class}, modules={ActivityModule.class})
@ActivityScope
public interface ActivityComponent extends ApplicationComponent {
ThirdThingy thirdThingy();
void inject(SomeActivity someActivity);
}
@Module
public class ActivityModule {
private Activity activity;
public ActivityModule(Activity activity) {
this.activity = activity;
}
//...
}
ApplicationComponent applicationComponent = DaggerApplicationComponent.create();
ActivityComponent activityComponent = DaggerActivityComponent.builder().activityModule(new ActivityModule(SomeActivity.this)).build();
Önemli şeyleri bilmek:
Kapsamlı bir sağlayıcı belirli bir kapsam için bir örnek oluştururher bileşen için. Bir bileşen anlamı kendi örneklerini takip eder, ama diğer bileşenler paylaşılan kapsamında bir havuz ya da biraz sihir yok. Belirli bir kapsam içinde bir örnek olması için, bu bileşenin bir örneğini gerekir. Bu kendi kapsamlı bağımlılıklarından erişmek için
ApplicationComponent
sağlamanız gerekiyor.Bir bileşen sadece tek bir kapsamlı bileşen subscope. Çok kapsamlı bileşen bağımlılıklar (eğer hepsi ben biraz olsa da farklı kapsamları varsa bile bir hata olduğunu düşünüyorum) izin verilmez.
Bu nesne-ömrü uzatan-kapatma C# derley...
Daha iyi bir şekilde jquery ile nesne ...
Nasıl bir IDisposable bir nesne başvur...
Bir "listesi" nesne için bir...
Nesne başvurusu bir nesnenin örneğine ...