Dagger2 注入一切?
Dagger2 inject everything?
我正在阅读有关 Dagger2 的文档。问题是我很清楚如何使用 this
注入 class Context
但我怀疑以下 class 例如:
public class SocialControler{
private ImageView twitterLogo;
private ImageView googleLogo;
public SocialControler(ImageView twitter, ImageView google){
twitterLogo = twitter;
googleLogo = google;
}
//Getters and Setters
}
所以在我的 MainActivity
我会有这样的东西
SocialControler mSocial = new SocialControler(mTwitterLogo, mGoogleLogo);
我是否应该使用 @Inject
注释而不是 new
来注入这个 class,这样我们的 Activity 上就不再有 new
了?如果是如何?
我卡在 @Mudule
了。我如何在 de Module
?
中提供视图
@Module
public class AppModuleSocialMediaManager {
@Provides
public MainActivity provideActivity(){
return new MainActivity();
}
@Provides
public SocialMediaClickManager provideMediaManager(MainActivity mainActivity, View twitterLogo, View googleLogo) {
return new SocialMediaClickManager(mainActivity);
}
@Provides
public View provideTwitter(){
return ?
//from here how I can provide a View
}
}
我不会推荐您用于构建应用程序的架构,即让您的控制器依赖于确切的视图,但如果您对此没有意见,那么您可以像这样实现您的模块:
@Module
public class AppModuleSocialMediaManager {
private final MainActivity mainActivity;
public AppModuleSocialMediaManager(MainActivity mainActivity) {
this.mainActivity = mainActivity;
}
@Provides
@Named("twitter_view")
View provideTwitterView() {
return mainActivity.findViewById(..);
}
@Provides
@Named("google_view")
View provideGoogleView() {
return mainActivity.findViewById(..);
}
@Provides
SocialController provideSocialController(@Named("twitter_view") View twitterView, @Named("google_view") View googleView) {
return new SocialController(twitterView, googleView);
}
}
然后你需要声明另一个组件。假设它是 MainActivityComponent
:
@Component(modules = AppModuleSocialMediaManager.class)
public interface MainActivityComponent {
void inject(MainActivity activity);
}
之后,在您的 activity 中,您可以执行如下操作:
public class MainActivity extends Activity {
@Inject
SocialController socialController;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DaggerMainActivityComponent.Builder()
.appModuleSocialMediaManager(new AppModuleSocialMediaManager(this))
.build()
.inject(this);
socialController.doSomething();
}
}
我正在阅读有关 Dagger2 的文档。问题是我很清楚如何使用 this
Context
但我怀疑以下 class 例如:
public class SocialControler{
private ImageView twitterLogo;
private ImageView googleLogo;
public SocialControler(ImageView twitter, ImageView google){
twitterLogo = twitter;
googleLogo = google;
}
//Getters and Setters
}
所以在我的 MainActivity
我会有这样的东西
SocialControler mSocial = new SocialControler(mTwitterLogo, mGoogleLogo);
我是否应该使用 @Inject
注释而不是 new
来注入这个 class,这样我们的 Activity 上就不再有 new
了?如果是如何?
我卡在 @Mudule
了。我如何在 de Module
?
@Module
public class AppModuleSocialMediaManager {
@Provides
public MainActivity provideActivity(){
return new MainActivity();
}
@Provides
public SocialMediaClickManager provideMediaManager(MainActivity mainActivity, View twitterLogo, View googleLogo) {
return new SocialMediaClickManager(mainActivity);
}
@Provides
public View provideTwitter(){
return ?
//from here how I can provide a View
}
}
我不会推荐您用于构建应用程序的架构,即让您的控制器依赖于确切的视图,但如果您对此没有意见,那么您可以像这样实现您的模块:
@Module
public class AppModuleSocialMediaManager {
private final MainActivity mainActivity;
public AppModuleSocialMediaManager(MainActivity mainActivity) {
this.mainActivity = mainActivity;
}
@Provides
@Named("twitter_view")
View provideTwitterView() {
return mainActivity.findViewById(..);
}
@Provides
@Named("google_view")
View provideGoogleView() {
return mainActivity.findViewById(..);
}
@Provides
SocialController provideSocialController(@Named("twitter_view") View twitterView, @Named("google_view") View googleView) {
return new SocialController(twitterView, googleView);
}
}
然后你需要声明另一个组件。假设它是 MainActivityComponent
:
@Component(modules = AppModuleSocialMediaManager.class)
public interface MainActivityComponent {
void inject(MainActivity activity);
}
之后,在您的 activity 中,您可以执行如下操作:
public class MainActivity extends Activity {
@Inject
SocialController socialController;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DaggerMainActivityComponent.Builder()
.appModuleSocialMediaManager(new AppModuleSocialMediaManager(this))
.build()
.inject(this);
socialController.doSomething();
}
}